- 使用
ReLU(rectified linear unit)
函数代替 sigmoid 函数可以使得梯度下降算法更快收敛 - loss function 不是随便选的.不同模型有不同的 loss function.
有些 lmathcal{l}l 有多个局部最优点,会导致 gradient descent 找不到全局最优值 损失函数(loss function)
计算单个训练示例的错误,而成本函数(cost function)
是整个训练集损失函数的平均值。
e.g.
lossfunction:l(y^i,yi)=−(yilog(y^i)+(1−yi)log(1−y^i)) loss function:l(hat{y}^i,y^i)=-(y^{i}log(hat{y}^i)+(1-y^i)log(1-hat{y}^i)) lossfunction:l(y^i,yi)=−(yilog(y^i)+(1−yi)log(1−y^i))
costfunction:J(w,b)=1m∑i=1mL(y^i,yi) cost function:J(w,b) = frac1msum_{i=1}^{m}L(hat{y}^i,y^i) costfunction:J(w,b)=m1i=1∑mL(y^i,yi)- 这一课的 反向传递算法 讲的非常直观,容易理解
- 可以将
np.reshape()
理解为:首先对数组进行散列(使用给定的索引顺序),然后使用与散列相同的索引顺序将散列数组中的元素插入到新数组中
reshape
会经常用到来保证向量维数正确,他的操作成本也很低,为o(1) broadcasting
: 进行矩阵四则运算时,如果矩阵(不是一维数组)维度不匹配,python 会自动补全矩阵. 如:
- 不要使用秩为 1 的数组,使用 n × 1 的矩阵.如: [ [1 2 3] ]
使用 assert
来确保矩阵维数正确
assert(a.shape == (5,1))
-
tanh=ex−e−xex+e−xtanh=frac{e^x-e^{-x}}{e^x+e^{-x}}tanh=ex+e−xex−e−x几乎在所有场合都比 sigmoid 函数表现更好,因此几乎不再使用sigmoid函数
我们更推荐使用ReLU 函数
, ReLU(z)=max(0,z)ReLU(z)=max(0,z)ReLU(z)=max(0,z),因为在计算的时候得到 0.0000000的概率很小,因此不用考虑在原点不可导的问题 -
神经网络的初始化参数一般都很小,如0.01
-
神经网络的层数只考虑 hidden layer 和 output layer, 不考虑 input layer
-
可以先尝试用 logistic regression ,在调节 隐藏层的层数, 可以将 隐藏层的层数看做一个超参数
-
想要得到没有 bug 的程序需要非常仔细的考虑矩阵的维数.
“我在 dubug 的时候,通常会拿出一张纸非常仔细的过一遍矩阵的维数” -
偏差和方差
训练集误差: 1% 15% 15% 1.5%
验证集误差:11% 16% 30% 1%
高方差 高偏差 双高 双低 -
L2 regularization(L2正则化):
J(W,b)=1m∑i=1mL(y^i,yi)+λ2m∣∣w∣∣22 J(W,b)=frac1msum_{i=1}^mL(hat{y}^i,y^i)+frac{lambda}{2m}||w||_2^2 J(W,b)=m1i=1∑mL(y^i,yi)+2mλ∣∣w∣∣22
其中:∣∣w∣∣22=wTw=∑j=1nxwj2其中:||w||^2_2=w^Tw=sum_{j=1}^{n_x}w_j^2其中:∣∣w∣∣22=wTw=∑j=1nxwj2, 称为 平方L2范数(L2范数是带一个根号的L_2范数是带一个根号的L2范数是带一个根号的).
L1 regularization(L1正则化):
J(W,b)=1m∑i=1mL(y^i,yi)+λm∑i=1nx∣w∣ J(W,b)=frac1msum_{i=1}^mL(hat{y}^i,y^i)+frac{lambda}{m}sum_{i=1}^{n_x}|w| J(W,b)=m1i=1∑mL(y^i,yi)+mλi=1∑nx∣w∣
其中:∣∣m∣∣1=∑j=1nx∣w∣其中:||m||_1=sum_{j=1}^{n_x}|w|其中:∣∣m∣∣1=∑j=1nx∣w∣, 称为 L1范数. -
在 Python 中, lambda 是保留字符.用 lambd代替
-
对神经网络进行正则化时,如果正则化参数 λlambdaλ 取值过大, 则 W 会变得很小.此时激活函数如 sigmoid=11+e−(WX+b)sigmoid=frac{1}{1+e^{-(WX+b)}}sigmoid=1+e−(WX+b)1 会落在原点附近取值,近似线性. 那么神经网络就失去了它的作用. 下图为 tanhtanhtanh 函数
-
利用标准正态分布使特征归一化: x=x−μσ,u=1m∑i=1mxi,σ2=∑(x−μ)2mx=frac{x-mu}{sigma}, u=frac1msum_{i=1}^mx_i,sigma^2=frac{sum(x-mu)^2}{m}x=σx−μ,u=m1∑i=1mxi,σ2=m∑(x−μ)2
-
使用
梯度检验
的注意事项:
1.不要在训练的时候使用,因为它太慢了
2.如果梯度检验表明BP算法失败, 要检查网络的的所有部分
3.不要忘记正则化
4.不要和dropout
一起使用 -
使用 batch 梯度下降法,一次遍历训练集只能让你做一个梯度下降,使用
mini-batch
梯度下降法,一次遍历训练集,能让你做 5000 个梯度下降。 -
如何选择
mini batch
的规模- 如果训练集较小(m ≤leq≤ 2000),直接使用 batch gradient descent
- 典型的 mini batch size: 64, 128, 256, 512
-
指数加权平均数
— vt=βvt−1+(1−β)θtv_{t}=eta v_{t-1}+(1-eta) heta_{t}vt=βvt−1+(1−β)θt -
动量梯度下降法(Gradient with Momentum)
monmentum 运行速度几乎总是快于普通的梯度下降法, 基本的想法就是计算梯度的指数加权平均数,并利用该梯度更新你的权重 -
RMSprop
和Adam
是少有的两种适用于不同深度学习结构的算法 -
加快学习算法的一个办法就是随时间慢慢减少学习率, 我们称为
学习率衰减(Learning rate decay)
当 lr 为固定值时,你的算法最后在最小值附近摆动, 并不会真正收敛 -
在实践中, 不必操作所有的细节, 但是知道其中的原理有助于优化算法
-
为问题设置一个单实数评估指标.
使用 F1 score
(查全率和查准率的调和平均数) :
F1=2×Precision×RecallPrecision+RecallF1 = 2 imes frac{Precision imes Recall}{Precision + Recall}F1=2×Precision+RecallPrecision×Recall
其中 P=TPTP+FP, R=TPTP+FNP = frac{TP}{TP+FP}, R = frac{TP}{TP+FN}P=TP+FPTP, R=TP+FNTP.
普通的通常均值将所有的值平等对待, 而调和平均值给予较低的值更高的权重, 从而能够更多的惩罚极端值. 所以, 如果精度和召回率都很高, 则分类器将得到很高的F1F1F1值.(F1F1F1越高越好)
- 训练集和测试集必须是来自同一个分布
- 数据分割
当操作大数据(比如100万个样本)时, 过去的 70%/30% 或 60%/20%/20% 的数据分割已经落伍.一种做法时 98%/1%/1% 来分割数据. - 深度学习对 随机误差 鲁棒性很强, 但是对 系统性的误差 鲁棒性很差.比如, 如果labeler 总是将白色的狗标记为猫, 则分类器学习了之后也会将白色的狗标记为猫
多任务学习
(使用比较少) 让神经网络同时做几件事情, 输出多个标签batch normalization
的好处:- 可以使得学习快速进行(可以增大学习率)
- 不那么依赖初始值(对于初始值不用那么神经质
- 抑制过拟合(降低 dropout 等的必要性)
- 参数的更新方法, 除了
SGD
之外, 还有Momentum
,AdaGrad
,Adam
(融合 Momentum和AdaGrad 的算法) 等方法 - 权重初始值的赋值方法对进行正确的学习非常重要, 作为权重初始值,
Xavier
(针对原点附近近似线性的激活函数),He
(针对ReLU) 等比较有效. - 抑制过拟合的正则化技术有
权值衰减
,Dropout
等 - 假设输入大小为(H,W)(H,W)(H,W), 滤波器大小为(FH,FW)(FH,FW)(FH,FW), 输出大小为(OH,OW)(OH,OW)(OH,OW), 填充为P (padding)P (padding)P (padding), 步幅为S(stride)S (stride)S(stride) .此时, 输出大小 可以通过下式计算:
OH=H+2P−FHS−1OW=W+2P−FWS−1 egin{aligned} OH&=frac{H+2P-FH}{S}-1 \ OW&=frac{W+2P-FW}{S}-1 end{aligned}OHOW=SH+2P−FH−1=SW+2P−FW−1
若除不尽, 则向下取整.