在之前的笔记中,我记录过《神经网络的代价函数及反向传播算法》,以及使用BP算法(反向传播算法)的一点细节。
这篇笔记想简短地总结记录一下训练并优化神经网络的几个步骤:
第零步:之所以写了个第零步,是想记录一下如何搭建神经网络,毕竟要先有网络才能谈后续的训练和优化。关于构建问题之前也有过记录:《神经网络的模型构建》。输入层的单元个数取决于特征个数,也就是 ;输出层的单元个数取决于训练集中结果的类别数量。具体需要我们决策的是中间隐藏层的数量以及每层的单元个数。一般来说,默认的隐藏层只有一层,若需要使用多个,则要保证每层的单元个数是相等的。通常隐藏层数越多,结果也越精确,但意味着计算量也随之增大,两者需要平衡。
第一步:进行参数的随机初始化。通常我们需要把参数初始化为趋近于0的极小的值。作逻辑回归时,我们通常将参数初始化为0,但对于神经网络这样是不可行的,若都初始化为0,那么第二层每个单元节点的值都会是相同的,若都初始化为同一个非零的数,结果也是一样的。所以每个参数要在0附近的正负值范围内随机选取。
第二步:执行前向传播。从左向右进行计算,对于输入的任意 ,计算出
,结果的形式为向量。
第三步:编写计算代价函数 的代码。
第四步:执行反向传播算法,计算所有的偏导数 ,即
关于
的偏导数。
第五步:使用梯度检验来将反向传播算法得到的偏导数值,与数值方法得到的估计值进行比较,以确保两种方法得到的值是接近的。进行这步的原因是,在实际运行过程中,我们的代码可能存在很多 bug, 的值虽然可能在减小,但最后得到的值可能存在极大的误差,采用梯度检查的方法可以减小这种错误的概率。但要注意之后把梯度检查的代码注释掉,因为非常花时间。
第六步:使用梯度下降法或更高级的算法(如BFGS算法、共轭梯度法),与反向传播算法相结合,来将 的值最小化。但要注意的是,由于神经网络并不是一个线性的模型,其代价函数
是个非凹函数,所以我们使用梯度下降等方法得到的结果只是一个局部最优解,并不保证就是全局最优解。
欢迎关注我的知乎专栏【数据池塘】,专注于分享机器学习、数据挖掘相关内容:https://zhuanlan.zhihu.com/datapool
⬇️ 扫描下方二维码关注公众号【数据池塘】 ⬇️
回复【算法】,获取最全面的机器学习算法网络图: