1.逻辑回归与神经网络算法的代价函数:
实际上这个代价函数计算的就是输出层的预测和实际结果的差值
2.黄线画出来的那一行是从矩阵的角度去实现这个计算过程
3.反向传播算法,按我的理解是一种反馈机制,即根据前向传播得到的偏差值,从最后一层开始一直往前计算θ矩阵的值,然后又根据新θ矩阵的值再次做出预测,然后反馈,重新计算,直到收敛,具体可参考这两篇文章:
https://www.cnblogs.com/charlotte77/p/5629865.html
https://blog.youkuaiyun.com/u014313009/article/details/51039334
4.计算各层各神经元的误差:
5.把矩阵转换成向量的好处是有时候一些优化函数会要求输入的参数是向量而不能是矩阵。
6.矩阵
→
\rightarrow
→向量:ThetaVec=[theta1(:);theta2(:)]
,其中theta1的尺寸为10*11
向量
→
\rightarrow
→矩阵:theta1=reshape(ThetaVec(1:110),10,11)
7.使用梯度检验的步骤:
1)使用反向传播计算出Devc
2)计算出gradApprox
3)确保第一第二步得到的数值相差不大
4)在训练模型前,关闭梯度检验(这条非常重要!这条非常重要!这条非常重要!)。因为梯度检验本身是个很慢的算法,加到模型里去会大大降低运算速度
7.对称权重问题:比如一开始训练神经网络时我们需要设置每条边的权重,一个选择是全设为0;但是这样没什么意思,因为每条边的权重都一样的话,那从第i层去到第i+1层,第i+1层所有的神经元都是一样的,这样的神经网络就没有什么特殊的地方。
8.隐藏层的单元个数一般都设置为和输入层的单元个数维度一样,即每层隐藏层的单元个数可以是输入层单元个数的一倍或者三四倍这样子。
9.训练一个神经网络的步骤:
翻译过来就是:
1)随机初始化参数
2)前向传播
3)计算代价函数
4)反向传播计算偏导数
5)梯度检查,确保反向传播算法的正确性
6)使用梯度下降算法来最小化代价函数
10.梯度下降等优化算法虽然不能保证可以得到最优值,但是其实也差不多了
11.这一周的作业要求实现前向传播和后向传播,这里记录一下一些常用的算法(基于matlab)
1)把实际值从向量转成矩阵
y=eye(num_labels)(y,:);
%在这里,num_labels是5000个,标签个数是10,原来y的形状是5000*1,
%经过这行代码的转化就变成5000*10了
2)所谓的多重连加号,实际就是多重循环,matlab可直接通过矩阵相加实现,不用考虑得太复杂
3)计算神经网络的代价的步骤:
下面这个例子的输入层、隐藏层、输出层分别有400、25、10个神经元,样本个数为5000
%第一层网络,构造一个 样本数*(输入层神经元个数+1)的矩阵
X=[ones(m,1) X];%5000*401
Z1=X*Theta1';%5000*401*401*25=5000*25
%计算得到第二层的神经元
A=(sigmoid(Z1));%5000*25
%然后构造一个 样本数*(隐藏层神经元个数+1) 的矩阵
A=[ones(m,1) A];%5000*26
Z2=A*Theta2';%5000*26*26*10=5000*10
p=(sigmoid(Z2));%5000*10
%把y从 样本数*1 变成 样本数*(输出层神经元个数+1)
y=eye(num_labels)(y,:);%5000*10
%虽然公式里有一大堆连加号,但是实际上都可以用一个.*直接解决
J=-sum(sum(y.*log(p)+(1-y).*log(1-p)))/m;
%正则化的时候,从x0边出发的边的权重不用算,所以就是从第二列开始算平方和
bias=lambda*(sum(sum(Theta1(:,2:end).^2))+sum(sum(Theta2(:,2:end).^2)))/(2*m);
J+=bias;
12.反向传播一直不太会,所以这周的作业基本就是各处搬运加工的了,感谢:
https://blog.youkuaiyun.com/ccblogger/article/details/78521601
作业地址:github
提交截图: