Machine Learing by Andrew Ng (5) --神经网络学习与反向传播算法

本文介绍了神经网络的基本概念,包括非线性假设的重要性、神经元与大脑的类比、模型表示及运算过程。并通过实例展示了简单的逻辑运算及复杂运算的实现方法。此外,还探讨了多元分类问题、代价函数定义、反向传播算法及其梯度检测等内容。

1.引入-非线性假设

在实际的机器学习问题中,一个训练集的特征数量十分庞大,若仍采用我们先前所学习的算法将产生过多的高阶多项式,大大减缓算法的运行速度,在正则化过后易造成欠缺拟合。因此,我们需要考虑新的想法来制作复杂的非线性分类器。
在这里插入图片描述
在这里插入图片描述
Example:
在图像识别的问题中,计算机通过像素点强弱值构建的数值矩阵作为特征值运算处理,一张仅50*50的灰度图片就要产生如此多的多项式。
在这里插入图片描述

2.神经元与大脑

大脑的不同皮层控制着人类不同的生理功能,想象将“外接设备”连接到相应的大脑皮层上,该设备是否会习得相应的功能。
在这里插入图片描述

Model representation-1

神经网络分输入层,输出层和中间的隐藏层。每层间运算的数据传递都拥有着“权重”(即特征参数值),每一项关联下一层的“神经元”也被称为激活项。
在这里插入图片描述
在这里插入图片描述
偏置单元的引入是为了表现运算的完整性。(之前的第一个特征X_0=1)
以下是每个参数传递的具体过程和字符表意。(以Logistic回归为例)
在这里插入图片描述

Model representation-2

为了实现向量化运算,我们采用z(i)来简化运算,具体如下。
在这里插入图片描述

3.例子与直觉理解

Example 1

实现基本的二进制逻辑运算是必不可少的功能,通过设置合适的Theta值可以达到我们的预期结果。
以下是逻辑与,或,非运算的演示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Example 2

如何结合基础运算在神经网络中表示更复杂的运算?
XNOR表示NOT XOR(异或)。
在这里插入图片描述

4.多元分类(One-vs-all)

一个优秀的神经网络不仅要准确的进行分类,更要有进行多元分类的功能。
科学家们采用不同的输出向量来表示输出的含义。
在这里插入图片描述
在这里插入图片描述

5.代价函数

在这个多元分类的问题中,我们如下定义神经网络学习过程中的代价函数。
每一条运算路径产生的代价都要包含。
在这里插入图片描述
在这里插入图片描述

6.反向传播算法

在这里插入图片描述

δ意思是该结点的偏移程度。

最后一层即输出层的偏移程度由向前传播算法求出来的对应激活值a- 训练集 的结果

剩下每层的δ计算方法,g‘(z(3))由微积分可以求解,结果为该层激活值a.*(1-a),其中.*为矩阵元素直接相乘。

δ(1)不存在因为第一层为输入层不会有偏差。
在这里插入图片描述
以上为反向传播算法的实现过程。
首先初始化每一个“神经元”的Δ为0,然后进行前向传播运算,得出每个activation的值,再由输出层的δ值往前推算,得出每一层中每一个“神经元”的δ值(即δ_ij)。

7.梯度检测

数值梯度检测的方法如下。
采用“两点法”能较为准确的估出代价函数每一处的导数,并与在反向传播中得出的导数进行近似比对,从而判断时下反向传播的可靠性。
在这里插入图片描述
在这里插入图片描述

8.随机初始化

若将所有权值设为0,在前向传播过程中将会不断产生相同的activation,这显然不符合我们“学习”的宗旨。
在这里插入图片描述
在这里插入图片描述
Tip:初始化中的ε与求导过程中的毫无关联。

9.总结

Training a network

1.初始化参数

2.前向传播得到每一个输出的拟合值和每一个激活项

3.计算代价函数

4.运用反向传播算法求导

5.梯度检测

6.用合适的算法最小化J(Θ)

在MATLAB中,我们可以使用`qlearn`函数结合`rl_agent`工具箱来实现Q-learning算法,这是一种基于贪心策略的离线强化学习方法。这里是一个简单的示例,用于解决环境中的“CartPole-v0”问题: ```matlab % 导入必要的库 import rl ReinforcementLearning % 创建环境 env = gym('CartPole-v0'); % 定义动作空间和状态空间 actionSpace = env.actionSpace; stateSpace = env.observationSpace; % 设置超参数 numEpisodes = 500; % 总训练集大小 gamma = 0.9; % 折扣因子 alpha = 0.1; % 学习率 epsilon = 0.1; % 探索率 experienceSize = 100; % 经验回放缓冲区大小 % 初始化Q表 Q = zeros(stateSpace.getNumStates(), actionSpace.getNumActions()); % 开始Q-learning for episode = 1:numEpisodes s = env.reset(); % 获取初始状态 experienceBuffer = ExperienceBuffer(experienceSize); while ~isDone(env) % 随机选择动作(探索和利用) if rand() < epsilon a = actionSpace.sample(); else [a, ~] = max(Q(s,:)); end % 执行动作并观察新状态、奖励和是否结束 [s', r, done, info] = step(env, a); % 存储经验 experienceBuffer.addExperience(s, a, r, s', done); % 更新Q表 if ~isempty(experienceBuffer) % 每隔一定步数更新 Q = updateQTable(Q, experienceBuffer, alpha, gamma); % 更新状态 s = s'; % 如果达到最大步数或者完成,则退出循环 if done || experienceBuffer.isFull() break; end end % 每n个episode降低探索率 epsilon = max(epsilon * 0.99, 0.01); % 防止过快收敛 end % 可以从Q表中获取最优策略 optimalPolicy = argmax(Q, 2); % 现在你可以用这个policy在环境中测试 testEpisode(env, optimalPolicy); function Q = updateQTable(Q, experienceBuffer, alpha, gamma) for i = 1:size(experienceBuffer.data, 1) s = experienceBuffer.data(i).state; a = experienceBuffer.data(i).action; r = experienceBuffer.data(i).reward; s_ = experienceBuffer.data(i).nextState; done = experienceBuffer.data(i).done; Q(s,a) = (1 - alpha) * Q(s,a) + alpha * (r + gamma * max(Q(s_, :))); end end function testEpisode(env, policy) s = env.reset(); totalReward = 0; while ~isDone(env) a = policy(s); [s', r, done, info] = step(env, a); totalReward = totalReward + r; s = s'; end fprintf('Test Episode Reward: %.2f\n', totalReward); end ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值