CS224N WINTER 2022(1)词向量(附)Assignment1答案) CS224N WINTER 2022(二)反向传播、神经网络、依存分析(附Assignment2答案) CS224N WINTER 2022(三)RNN、语言模型、梯度消失和梯度爆炸Assignment3答案) CS224N WINTER 2022(四)机器翻译、注意力机制、subword模型(附Assignment4答案) CS224N WINTER 2022(五)Transformers详解(附Assignment5答案)
序言
-
CS224N WINTER 2022课件可从https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1224/下载,也可从以下网盘获取:
https://pan.baidu.com/s/1LDD1H3X3RS5wYuhpIeJOkA 提取码: hpu3
本系列博客的开头还将提供下载链接,总结相应的课件。
-
(Updating):GitHub@cs224n-winter-2022
-
:
-
作者根据自己的情况记录更有用的知识点,并提出少量的意见或扩展延伸,而不是slide内容完整笔注;
-
CS224N WINTER 2022年共五次作业,作者提供自己完成的参考答案,不保证其正确性;
-
由于CSDN限制博客字数,作者不能在博客中发表完整内容,只能分篇发布,可以从我身上发布GitHub Repository获得完整的笔记,(Updating):
CS224N WINTER 2022(1)词向量(附)Assignment1答案)
CS224N WINTER 2022(2)反向传播、神经网络、依存分析(附件)Assignment2答案)
CS224N WINTER 2022(三)RNN、语言模型、梯度消失和梯度爆炸Assignment3答案)
CS224N WINTER 2022年(4)机器翻译注意力机制subword模型(附Assignment4答案)
CS224N WINTER 2022(五)Transformers详解(附Assignment5答案)
-
文章目录
- 序言
-
- lecture 3 反向传播和神经网络
-
- slides
- notes
- suggested readings
- additional readings
- assignment2 参考答案
-
- 1. written
- 2. coding
- lecture 4 依存分析
-
- slides
- notes
- suggested readings
- pytorch tutorial session
lecture 3 反向传播和神经网络
本节属于机器学习和深度学习的基础知识。
slides
[slides]
-
矩阵(向量)链式求导中的计算技巧:slides p.39
假设神经网络的操作步骤如下: x ( input ) → z = W x b → h = f ( z ) → s = u ? h (3.1) x(\text{input})\rightarrow z=Wx b\rightarrow h=f(z)\rightarrow s=u^\top h\tag{3.1} x(input)→z=Wx b
→h=f(z)→s=u⊤h(3.1) 则计算网络参数 W W W与 b b b的参数时: ∂ s ∂ W = ∂ s ∂ h ∂ h ∂ z ∂ z ∂ W ∂ s ∂ b = ∂ s ∂ h ∂ h ∂ z ∂ z ∂ b (3.2) \frac{\partial s}{\partial W}=\frac{\partial s}{\partial h}\frac{\partial h}{\partial z}\frac{\partial z}{\partial W}\quad\frac{\partial s}{\partial b}=\frac{\partial s}{\partial h}\frac{\partial h}{\partial z}\frac{\partial z}{\partial b}\tag{3.2} ∂W∂s=∂h∂s∂z∂h∂W∂z∂b∂s=∂h∂s∂z∂h∂b∂z(3.2) 可以定义(local error signal): δ = ∂ s ∂ h ∂ h ∂ z = u ⊤ ∘ f ′ ( z ) (3.3) \delta=\frac{\partial s}{\partial h}\frac{\partial h}{\partial z}=u^\top\circ f'(z)\tag{3.3} δ=∂h∂s∂z∂h=u⊤∘f′(z)(3.3) 则可以使得计算 ( 3.2 ) (3.2) (3.2)式的更加简单,事实上进一步计算可以发现: ∂ s ∂ W = ∂ s ∂ h ∂ h ∂ z ∂ z ∂ W = δ ∂ z ∂ W = δ ⊤ x ⊤ ∂ s ∂ b = ∂ s ∂ h ∂ h ∂ z ∂ z ∂ b = δ ∂ z ∂ b = δ (3.4) \begin{aligned} \frac{\partial s}{\partial W}&=\frac{\partial s}{\partial h}\frac{\partial h}{\partial z}\frac{\partial z}{\partial W}=\delta\frac{\partial z}{\partial W}=\delta^\top x^\top\\ \frac{\partial s}{\partial b}&=\frac{\partial s}{\partial h}\frac{\partial h}{\partial z}\frac{\partial z}{\partial b}=\delta\frac{\partial z}{\partial b}=\delta \end{aligned}\tag{3.4} ∂W∂s∂b∂s=∂h∂s∂z∂h∂W∂z=δ∂W∂z=δ⊤x⊤=∂h∂s∂z∂h∂b∂z=δ∂b∂z=δ(3.4) 此时我们称 x x x是(local input signal)。 这就是反向传播高效的原因,事实上只需要在神经网络的每条传播路径上存储两端节点变量的偏导值(如神经网络中节点 z z z指向节点 h h h,则存储 ∂ h / ∂ z \partial h/\partial z ∂h/∂z),即可快速计算任意两个节点变量之间的偏导值。
-
(General Computation Graph):slides p.77 ∂ z ∂ x = ∑ i = 1 n ∂ z ∂ y i ∂ y i ∂ x (3.5) \frac{\partial z}{\partial x}=\sum_{i=1}^n\frac{\partial z}{\partial y_i}\frac{\partial y_i}{\partial x}\tag{3.5} ∂x∂z=i=1∑n∂yi∂z∂x∂yi(3.5) 其中 { y 1 , y 2 , . . . , y n } \{y_1,y_2,...,y_n\} { y1,y2,...,yn}是 x x x指向的所有节点。
notes
[notes]
-
:notes p.8-18
-
:
自动梯度计算一般使用的是数值近似的方法: f ′ ( x ) ≈ f ( x + ϵ ) − f ( x ) ϵ (3.6) f'(x)\approx \frac{f(x+\epsilon)-f(x)}{\epsilon}\tag{3.6} f′(x)≈ϵf(x+ϵ)−f(x)(3.6) 而非解析方法,因此总是存在一定的误差(特殊情况下可能就是错误的)。
梯度检验是一种用来比较数值梯度值与解析梯度值之间差距的方法。下面是一个简单的demo:
def eval_numerical_gradient(f, x): """ a naive implementation of numerical gradient of f at x - f should be a function that takes a single argument - x is the point (numpy array) to evaluate the gradient at """ fx = f(x) # evaluate function value at original point grad = np.zeros(x.shape) h = 0.00001 # iterate over all indexes in x it = np.nditer(x, flags=['multi_index'], op_flags = ['readwrite']) while not it.finished: # evaluate function at x+h ix = it.multi_index old_value = x[ix] x[ix] = old_value + h # increment by h fxh_left = f(x) # evaluate f(x + h) x[ix] = old_value - h # decrement by h fxh_right = f(x) # evaluate f(x - h) x[ix] = old_value # restore to previous value (very important!) # compute the partial derivative grad[ix] = (fxh_left - fxh_right) / (2 * h) # the slope it.iternext() # step to next dimension return grad
-
:常用于处理模型过拟合的问题,一般是在损失函数中引入模型参数矩阵的 F F F范数(相当于是所有参数的二范数值)。
-
:常用于处理模型过拟合与降低模型复杂度。在反向传播中以一定概率剪除神经网络的传播路径。
-
:Sigmoid,Tanh,Hard tanh,Soft sign,ReLU,Leaky ReLU
-
:减均值(中心化),正则化,白化(去除特征之间的相关性,如通过奇异值分解)。
-
:这个其实还是有讲究的,参数初始值的确对模型优化可能产生显著影响,有兴趣可以扒扒PyTorch中的参数初始化源码,是有很多不同的初始化方式的。如果我记得没错的话,PyTorch中绝大多数层的参数初始化用的都是本节中提到的这种方式: W ∼ Uniform ( − 6 n ( l ) + n ( l + 1 ) , 6 n ( l ) + n ( l + 1 ) ) (3.7) W\sim\text{Uniform}\left(-\sqrt{\frac{6}{n^{(l)}+n^{(l+1)}}},\sqrt{\frac{6}{n^{(l)}+n^{(l+1)}}}\right)\tag{3.7} W∼Uniform(−n(l)+n(l+1)6 ,n(l)+n(l+1)
-