亲爱的朋友们,多多有一段时间没有更新啦,主要是我在学习transformers突然开始思考几个神经网络相关的基本问题(模型结构越写越复杂,调包效果越来越好,是否还记得为什么而出发呢?),读者朋友也可以看看是否可以自如回答:
- 什么是链式法则?
- 什么是Jacobin矩阵?
- Jacobin有什么用处?
- 梯度的定义是什么?
- 方向导数和梯度的关系是什么?
- 神经网络中张量反向传播有什么特点?
- 哪些特性保证了神经网络中高效的梯度计算?
我将我的总结神经网络中的数学基础写到了一起放到了github,做成了一个网站,当然网站中也会逐渐加入之前写的transformer推送内容:
https://erenup.github.io/deeplearningbasics/
还会持续更新,欢迎大家star或者提交issue/request~谢谢。
本来想一篇推送更新完,但考虑到大家时间有限,没法一次看完,于是个人觉得把最常用的章节挑出来更新一下,本文公式较多,排版尽可能简单化啦。
完整内容请查阅网站~
1. 矩阵乘以列向量求
可以看作函数将输入 经过变换得到输出,那么Jacobian矩阵
z_i = \sum^{m}_k W_{ik}x_k
那么
(\frac{\partial z}{\partial x})_{i,j} = \frac{\partial z_i}{\partial x_j} = \frac{\partial {\sum^{m}_k W_{ik}x_k}}{\partial x} = \sum^{m}_k W_{ik} \frac{\partial x_k}{\partial x_j} = W_{ij}
由于 if else 0, 所以有
2.
3. 向量等于自身,求
因为 所以
(\frac{\partial z}{\partial x})_{i,j} = \frac{\partial z_i}{\partial x_j} = \frac{\partial x_i}{\partial x_j} = \{^{1, i=j}_{0, otherwise}
所以,将其放在链式法则中进行矩阵乘法时候不会改变其他矩阵。
4. 对向量中每个元素进行变换, 求
由于所以
(\frac{\partial z}{\partial x})_{i,j} = \frac{\partial z_i}{\partial x_j} = \frac{\partial f(x_i)}{\partial x_j} = \{^{f'(x_i), i=j}_{0, otherwise}
所以是一个diagonal matrix 且
矩阵乘以一个diagonal矩阵也就是每个元素进行幅度变换,因此链式法则中的矩阵乘以相当于和做elementwise 乘法。
5. ,求
我们开始引入更复杂的情况,因为神经网络中往往包含多次链式法则的引用,这里我们假设已经知道,直接求。
假设神经网络的损失函数是标量,我们想计算的是损失函数对参数的梯度。我们可以想象神经网络这个函数输入是一个形状的参数,输出是一个标量,结合上一章节Jacobian知识我们可以知道形状和一样,所以在神经网络训练的时候可以将参数减轻去参数的梯度乘以学习率。
根据链式法则,我们需要求出。这个三维的张量不方便表示且十分复杂,因此我们先只看对求导。
z_k = \sum^m_{l=1} W_{kl}x_l
\frac{\partial z}{\partial W_{ij}} = \sum^m_{l=1}x_l \frac{\partial W_{kl}}{\partial W_{ij}}
\frac{\partial W_{kl}}{\partial W_{ij}} = \{^{1, i=k, j=l}_0
所以只有时候非零
\frac{\partial J}{\partial W_{ij}} = \begin{bmatrix}
0\\
.\\
x_j\\
.\\
0
\end{bmatrix} \leftarrow ith element, j=l所以
\frac{\partial J}{\partial W_{ij}} = \frac{\partial J}{\partial z}\frac{\partial z}{\partial W_{ij}} = \delta \frac{\partial z}{\partial W_{ij}} = \delta_i x_j
所以得到
\frac{\partial J}{\partial W} = \delta^T x^T
6.
7.
假设神经网络到达softmax之前的输出为,为分类数量,那么
\hat{y} = softmax(\Theta), \theta_i = \frac{e^{\theta_i}}{\sum^n_k e^{\theta_k}}
J = \sum^n_{i=1}y_ilog(\hat{y_i})
\frac{\partial J}{\hat{y_i}} = \frac{y_i}{\hat{y_i}}
\frac{\partial \hat{y_i}}{\theta_i} = \{^{\hat{y_i}(1-\hat{y_k}), i=k}_{-\hat{y_i}\hat{y_k}, i \neq k}
\frac{\partial J}{\theta_i} = \frac{\partial J}{\hat{y}} \frac{\partial \hat{y}}{\theta_i}, 形状为1 \times n, n \times 1
\frac{\partial J}{\theta_i} = \sum^n_{k=1}{\frac{\partial J}{\hat{y_k}} \frac{\partial \hat{y_k}}{\theta_i}} (k=i, k\neq i)
\frac{\partial J}{\theta_i} = \frac{\partial J}{\hat{y_i}} \frac{\partial \hat{y_i}}{\theta_i} + \sum^n_{k \neq i}{\frac{\partial J}{\hat{y_k}} \frac{\partial \hat{y_k}}{\theta_i}} (k=i, k\neq i)
\frac{\partial J}{\theta_i} = y_i(1- \hat{y_i}) + \sum_{k neq i} {y_k \hat{y_i}}
\frac{\partial J}{\theta_i} = -y_i(1- \hat{y_i}) + \sum_{k neq i} {y_k \hat{y_i}}
\frac{\partial J}{\theta_i} = -y_i + \hat{y_i} \sum {y_k}
\frac{\partial J}{\theta_i} = \hat{y_i} -y_i
所以
\frac{\partial J}{\theta} = \hat{y} -y \in \mathbb R^{n}
结语
本来对于矩阵求导还有些发怵的我,在熟练以上几个公式之后发现神经网络反向传播的求导也不是那么遥不可触。希望能对大家有帮助。