Lecture 6. Neural Tips and Tricks
Lecture 6主要介绍了深度学习应用的一些小技巧,例如多任务训练、梯度检测、正则化、多种激活函数、参数初始化、学习速率等。
文章目录
多任务学习(也叫权重共享)
对比上节课我们学到的神经网络,多任务学习就是在输出层用softmax分类器取代标量得分。训练方法依然采用后向传播。
神经网络和传统机器学习方法的不同在于,深度学习需要同时学习词向量和权重。
主要思想:我们在训练多种不同NLP任务(例如NER和POS),可以共享两个任务的词向量和隐藏层的权重,只有输出层的softmax权重不同。损失函数是不同任务损失函数相加,例如:
δ t o t a l = δ P O S + δ N E R \delta^{total} = \delta^{POS} + \delta^{NER} δtotal=δPOS+δNER
参考论文《NLP(almost from scratch, Collobert et al.2011)》
成功的神经网络的通用步骤是这样的:
- 选择合适的网络框架
- 框架:单个词、固定窗口、词袋、循环神经网络、递归神经网络、CNN等;
- 非线性神经单元
- 用梯度检测器检查实现代码是否存在bug
- 参数初始化
- 优化技巧
- 检查模型是否强大到过拟合
- 如果没有过拟合,改变模型框架或者模型调大
- 如果过拟合,请用正则化
下面我们根据这些步骤分别介绍使用技巧。
梯度检测
梯度检测我们在第一次作业中用过,从导数的本质上求得参数的梯度,和我们用后向传播计算得到的梯度对比。公式如下:
f ′ ( θ ) ≈ J ( θ ( i + ) ) − J ( θ ( i − ) ) 2 ϵ f\prime (\theta) \approx \frac{J(\theta^{(i+)}) - J(\theta^{(i-)})}{2\epsilon} f′(θ)≈2ϵJ(θ(i+))−J(θ(i−))
其中, θ ( i + ) = θ + ϵ × e i \theta^{(i+)} = \theta + \epsilon \times e_i θ(i+)=θ+ϵ×ei
简单的代码实现为:
old_value = x[ix]
x[ix] = old_value + h
fxh = f(x)
x[ix] = old_value
grad[ix] = (fxh - fx) / h
如果梯度检测失败了应该怎么做?修改代码确定没有bug!
正则化
正则化前面课程提到的次数也很多,和大多数分类器一样,神经网络也需要避免过拟合,使得验证集和测试集能够获得良好的表现。正则化后的损失函数为:
J R = J + λ ∑ i = 1 L ∣ ∣ W ( i ) ∣ ∣ F J_R = J + \lambda\sum_{i=1}^L||W^{(i)}||_F JR=J+λi=1∑L∣∣W(i)∣∣F
上式中, ∣ ∣ W ( i ) ∣ ∣ F ||W^{(i)}||_F ∣∣W(i)∣∣F是矩阵 W ( i ) W^{(i)} W(i)的 F F F范数, λ \lambda λ是正则化选项的相对权重。
非线性神经元
目前为止我们讨论的非线性神经元有sigmoid,然而在很多应用中有更好的激活函数。常用的有:
Sigmoid
公式:
σ ( z ) = 1 1 + e x p ( − z ) ∈ ( 0 , 1 ) \sigma(z) = \frac{1}{1+exp(-z)} \in (0,1) σ(z)=1+exp(−z)1∈(0,1)
梯度:
σ