激活函数
Sigmod
Sigmoid(x)=\frac{1}{1+e^{-x}}
Tanh
Tanh(x)=tanh(x) =\frac{e^x-e^{-x}}{e^x+e^{-x}}
ReLU
ReLU(x) = max(0, x)
Leaky ReLU
LeakyReLU(x)=max(0,x)+negativeSlope\times min(0,x)
Softmax
Softmax(x_i)=\frac{exp(x_i)}{\sum_jexp(x_j) }
- Applies the Softmax function to an n-dimensional input Tensor rescaling them so that the elements of the n-dimensional output Tensor lie in the range [0,1] and sum to 1.
Conclusion
- ReLU激活函数,使用较多,学习率的设定不要太大
- Sigmod激活函数,不要使用
- Tanh激活函数,可以试试
- 一般在同一个网络中,使用同一种类型的激活函数,很少使用混合类型的激活函数
权重初始化
Batch Normalization
- 核心想法就是标准化这个过程是可微的
- 可以将标准化过程应用到神经网络的每一层中做向前传播和反向传播,通常批标准化应用在全连接层后面、非线性层前面
- 可以理解为在网络的每一层前面都会做数据的预处理
#添加激活函数增加网络的非线性,添加批标准化加快收敛速度
self.layer1=nn.Sequential(nn.Linear(a,b),nn.BatchNorm1d(b),nn.ReLU(True))
#批标准化一般放在全连接层的后面、非线性层(激活函数)的前面
self.layer2=nn.Sequential(nn.Linear(b,c),nn.BatchNorm1d(c),nn.ReLU(True))
#最后一个输出层不能添加激活函数,因为输出结果表示的是实际的得分
self.layer3=nn.Sequential(nn.Linear(c,d))
防止过拟合
一般采用全局权重的L2正则化搭配Dropout来防止过拟合
Dropout
self.layer1=nn.Sequential(nn.Dropout(),nn.Linear(a,b),nn.ReLU(True)) self.layer2=nn.Sequential(nn.Dropout(),nn.Linear(b,c),nn.ReLU(True)) self.layer3=nn.Sequential(nn.Dropout(),nn.Linear(c,d))
优化算法
SGD
- stochastic gradient descent (optionally with momentum)
随机梯度下降法是梯度下降法的一个小变形,就是每次使用一批(batch)数据进行梯度的计算,而不是计算全部数据的梯度,使用随机梯度下降法可能每次都不是朝着真正最小的方向,但是这样反而容易跳出局部极小点
Adagrad
自适应学习率(adaptive)的方法
RMSprop
- Proposed by G. Hinton in his course.
自适应学习率的改进方法
Adam
RMSprop + Momentum
Conclusion
- 默认使用Adam
- 值得尝试SGD+Momentum