机器学习笔记(九) 神经网络的学习

1.代价函数

   首先引入一些新记法,便于稍后讨论。

   假设神经网络的样本有m个,每个样本包含一组输入x和一组输出信号y,L表示神经网络的层数,Sl即第l层的单元个数(不包括偏置单元)。

   将神经网络的分类定义为两种情况:二类分类和多类分类。

  

   在逻辑回归中,我们的代价函数:

  

   我们只有一个输出变量,也只有一个因变量y。但是在神经网络中不同,我们可以有很多输出变量,我们的hθ(x)是一个维度为k的向量,并且我们训练集中的因变量也是同样维度的向量,一次我们的代价函数会更复杂。

   神经网络的代价函数:

  

   代价函数虽然看起来复杂,但是背后的思想相同,我们希望通过代价函数来观察算法预测的结果与真实情况的误差。不同的地方在于,对于每一行特征,我们都会给出k个预测,预测k个不同的结果,选择其中可能性最高的一个,与y中的实际数据比较。后面的正则化是排除了每一层的θ0后,每一层的θ矩阵的和。最里层的循环j循环所有的行,外面的i循环所有的列。


2.反向传播算法

   和线性回归和逻辑回归类似,神经网络也可以用梯度下降算法,但是神经网络比较复杂,该如何计算梯度?

   需要如下两个式子:

    

   在前面,我们给出了前馈网络的计算方法,对于一个给定训练样本的神经网络,通过前向传播的方式从输入层开始,正向一层一层进行计算,直到最后一层。

   现在,为了计算代价函数的偏导数,我们需要一种反向传播算法。其核心是最小化网络输出值和目标值之间的误差。首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直至倒数第二层。

   对下面的神经网络:

  

   利用前向传播算法的计算方法:

  

   我们从最后一层的误差开始计算,误差是激活单元的预测与实际值之间的误差,用δ表示。即

   再利用这个误差去计算前一层的误差:

     

   其中是S型函数的导数,是权重导致的误差的和。

   下面继续计算第二层的误差:

    

   第一层是输入变量,不存在误差。我们有了所有的误差的表达式后,便可以计算代价函数的偏导数,假设λ=0,不做正则化处理,偏导数计算如下:

  

   上面的式子中,各个参数的意义:

    l:目前所计算的是第几层;

    j:目前计算层中的激活单元的下标,也是下一层第j个输入变量的下标;

    i:下一层中误差单元的下标;

   现在我们给出一个完整的后向传播算法,表示误差矩阵:

  

   首先正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差用反向传播方法计算出知道第二层的误差。


3.反向传播算法的直观解释

   相比较于线性回归和逻辑回归,从数学的角度上,反向传播算法显得非常复杂,所以更需要我们仔细梳理,多做练习。

   再来仔细研究下前向传播的原理:

   前向传播算法:

  

   上面的神经网络,它有四层,除了输出层有一个单元,其他每层都有两个单元。对于一个训练样本,可以通过前向传播的方式计算各个相关单元,如下图:

  

   至于反向传播的做法:

   首先简化神经网络的代价函数:

  

   仅关注一个样本,化简:

  

   反向传播算法的过程:

  


4.梯度下降算法的检验

   当我们对一个较为复杂的模型,比如说神经网络使用梯度下降算法时,可能会存在一些不容易发觉的错误,虽然代价看上去在不断减小,但是有可能不是最优解。

   为了避免这样的错误,我们采取一种叫做梯度的数值检验。

   对梯度的估计采用的方法是在代价函数上沿着切线的方向选择两个距离很近的点,然后计算两个点的平均值用来估计梯度。

  

   对点θ,计算出在θ-ε处和θ+ε处的代价值(ε很小),然后求两个代价的平均值,用来估计θ处的代价值。

  

   同理,对于多元参数和参数向量来说,同样适用。

  

   当然,我们的主要目标是检查这个梯度的近似向量与反向传播算法得到的梯度向量是否近似相等:

  

   需要注意的地方:

   首先实现反向传播算法来计算梯度向量DVec。

   其次实现梯度的近似向量;

   确保计算的值近似相等;

   在实际的神经网络学习时,使用反向传播算法,关掉梯度检查;

   确保在训练分类器时关闭梯度检查的代码,否则代码运行效率很低。


5.随机初始化

   任何优化算法都需要一些初始的参数。在以前,我们初始所有的参数为0,这在逻辑回归中是可行的,但对于神经网络来说不可行。

   如果我们初始所有的参数为0,这意味着我们第二层的所有激活单元都会有相同的值。同理,如果所有的参数初始为一个相同的非0的数,结果也是一样的。

   这个问题又称为对称的权重问题,为了打破这种对称,提供一种随机初始化参数向量的方法:

   初始化参数为正负ε之间的随机值,ε可以很小。

  


6.综合

   总结下使用神经网络时的步骤:

   首先要确定网络结构,决定选择多少层以及每层有多少个单元。

   第一层的单元数是我们训练集的特征数量;最后一层的单元数是我们训练集结果的类的数量。如果隐藏层数大于1,要保证每个隐藏层的单元个数相同,一般来说,单元个数越多越好。

   我们真正要决定的是隐藏层的层数和每个中间层的单元数。

  


   确定好神经网络的结构后,训练神经网络:

   参数的随机初始化;

   正向传播计算所有hθ(x);

   计算代价函数;

   反向传播算法计算偏导数;

   梯度检查检验这些偏导数;

   优化算法来最优化代价函数;





全部评论

相关推荐

自从我室友在计算机导论课上听说了“刷 LeetCode 是进入大厂的敲门砖”,整个人就跟走火入魔了一样。他在宿舍门口贴了一张A4纸,上面写着:“正在 DP,请勿打扰,否则 Time Limit Exceeded。”日记本的扉页被他用黑色水笔加粗描了三遍:“Talk is cheap. Show me the code。”连宿舍聚餐,他都要给我们讲解:“今天的座位安排可以用回溯算法解决,但为了避免栈溢出,我建议用动态规划。来,这是状态转移方程:dp[i][j] 代表第 i 个人坐在第 j 个位置的最优解。”我让他去楼下取个快递,他不直接去,非要在门口踱步,嘴里念念有词:“这是一个图的遍历问题。从宿舍楼(root)到驿站(target node),我应该用 BFS 还是 DFS?嗯,求最短路径,还是广度优先好。”和同学约好出去开黑,他会提前发消息:“集合点 (x, y),我们俩的路径有 k 个交点,为了最小化时间复杂度,应该在 (x/2, y/2) 处汇合。”有一次另一个室友低血糖犯了,让他帮忙找颗糖,他居然冷静地分析道:“别急,这是一个查找问题。零食箱是无序数组,暴力查找是 O(n)。如果按甜度排序,我就可以用二分查找,时间复杂度降到 O(log n)。”他做卫生也要讲究算法效率:“拖地是典型的岛屿问题,要先把连通的污渍区块都清理掉。倒垃圾可以用双指针法,一个指针从左往右,一个从右往左,能最快匹配垃圾分类。”现在我们宿舍的画风已经完全变了,大家不聊游戏和妹子,对话都是这样的:“你 Two Sum 刷了几遍了?”“别提了,昨天遇到一道 Hard 题,我连暴力解都想不出来,最后只能看题解。你呢?”“我动态规划还不行,总是找不到最优子结构。今天那道接雨水给我整麻了。”……LeetCode 真的害了我室友!!!
老六f:编程嘉豪来了
AI时代还有必要刷lee...
点赞 评论 收藏
分享
刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结: 27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务