机器学习笔记(3): 神经网络初步

news/2025/1/21 9:38:07/文章来源:https://www.cnblogs.com/jeefy/p/18238472

神经网络应该由若干神经元组成。

前面的每一个神经元都会给到一个参数,将传递的所有参数看作一个向量 \(\vec x\),那么此神经元的净输入为:

\[z = x \omega + b \]

其中 \(\omega\) 称为权重向量

这里认为 \(x\)向量,而 \(\omega\)向量。

神经元还有一个激活函数 \(f(\cdot)\)

\[a = f(z) \]

称为函数的活性值

一般来说,我们使用 Logistic 函数,即 \(\sigma(x) = \frac 1 {1 + exp(-x)}\) 作为激活函数。

激活函数

激活函数有很多很多种,一般来说要满足以下几点:

  1. 连续且可导的非线性函数。
  2. 函数本身和其导数要尽可能简单。
  3. 值域要在一个合适的区间内

这里列举几种常见的函数。

Sigmoid 型

指一类两端饱和的 S 型曲线。

饱和
\(\lim_\limits{x \to -\infty} f'(x) = 0\) 称为左饱和,\(\lim_\limits{x \to \infty} f'(x) = 0\) 称为右饱和。
同时满足则称为两端饱和。

常见的 Sigmoid 型函数有 LogisticTanh

  • Logistic 函数

\[\sigma(x) = \frac 1 {1 + \exp(-x)} \]

其导数:

\[\sigma'(x) = \frac {\exp(-x)}{(1 + \exp(-x))^2} = \sigma(x) (1 - \sigma(x)) \]

  • Tanh 函数

\[{\rm tanh}(x) = \frac {\exp(x) - \exp(-x)}{\exp(x) + \exp(-x)} \]

其可以看作缩放平移后的 \(\sigma\),因为:

\[{\rm tanh}(x) = 2 \sigma(2x) - 1 \]

自然其导数:

\[{\rm tanh}'(x) = 4 \sigma(2x)(1 - \sigma(2x)) = \frac {4}{(\exp(x) + \exp(-x))^2} \]

实际上我们可以通过近似的方法去拟合这个函数,毕竟 \(e^x\) 也不是那么好算的。

  • Hard-LogisticHard-Tanh 函数

\[{\rm hard-\sigma}(x) = \begin{cases} 1 & x > 2 \\ \frac x 4 + \frac 1 2 & x \in [-2, 2] \\ 0 & x < 2 \end{cases} \]

或者利用 \(\min, \max\) 简化:

\[{\rm hard-\sigma}(x) = \max(\min(\frac x 4 + \frac 1 2, 1), 0) \]

类似的:

\[{\rm hard-tanh}(x) = \max(\min(x, 1), -1) \]

ReLU

也就是 Rectified Linear Unit,线性修正单元,定义为:

\[{\rm ReLU}(x) = \begin{cases} x & x \ge 0 \\ 0 & x < 0 \end{cases} \]

也就是 \({\rm ReLU}(x) = \max(x, 0)\)

当然,因为可能出现 死亡 ReLU 问题,所以一般有如下变形:

\[{\rm PReLU}(x) = \begin{cases} x & x \ge 0 \\ \gamma x & x < 0 \end{cases} \]

如果 \(\gamma = 0\) 则退化为 \(\rm ReLU\) 函数,如果 \(\gamma < 1\),那么也可以写为:

\[{\rm LeakyLU(x)} = \max(x, \gamma x) \]

另一个变形是:

\[{\rm ELU}(x) = \begin{cases} x & x \ge 0 \\ \gamma(\exp(x) - 1) & x < 0 \end{cases} \]

还有一个则是:

\[{\rm Softplus}(x) = \log(1 + \exp(x)) \]

Swish 函数

这是一种自控门函数:

\[{\rm swish}(x) = x \sigma(\beta x) \]

网络结构

网络结构分三种:

  • 前馈网络
  • 记忆网络
  • 图网络

这里先讲述前馈网络

这是一个前馈网络的示意图,其中第一层为输入层,最后一层为输出层。

而中间的那些层称为隐藏层。隐藏层可以有多个,而这里只画出了一个。

每一层有若干神经元,而两层间的神经元两两相连。

现在我们定义一些符号:

  • \(L\) 表示总层数,注意这里输入层为第 \(0\) 层,不计入其中;输出层为第 \(L\) 层。
  • \(M_l\) 表示第 \(l\) 层的神经元数量。
  • \(f_l(\cdot)\) 表示第 \(l\) 层的激活函数。
  • \(W^{(l)} \in \mathbb{R}^{M_l \times M_{l - 1}}\) 表示第 \(l - 1\) 层到第 \(l\) 层的权重矩阵(若干权重向量组成)。
  • \(b^{(l)} \in \mathbb{R}^{M_l}\) 表示第 \(l\) 层的偏置。
  • \(z^{(l)} \in \mathbb{R}^{M_l}\) 表示净输入。
  • \(a^{(l)} \in \mathbb{R}^{M_l}\) 表示输出。

对于一组数据 \((\vec x, y)\),前馈神经网络通过如下算法进行传播:

\[\begin{aligned} z^{(l)} &= W^{(l)} a^{(l - 1)} + b^{(l)} \\ a^{(l)} &= f_l(z^{(l)}) \end{aligned} \]

参数学习

参数学习可能略有点复杂,证明过程我懒得写成 \(\LaTeX\),这里就省略了。

我们利用反向传播算法进行学习,其步骤如下:

  • 选取一个数据,计算 \(a^{(l)}\)\(z^{(l)}\)
  • 反向传播每一层的误差 \(\delta^{(l)}\)
  • 计算每一层的偏导数,更新参数

显然的是 \(\delta^{(L)} = a^{(L)} - y\)

经过一番神秘的推导,我们可以得到:

\[\delta^{(l)} = f_l'\left(z^{(l)}\right) \cdot \left( \left( W^{(l + 1)} \right)^T \delta^{(l + 1)} \right) \in \mathbb{R}^{M_l} \]

其中 \(\cdot\) 表示元素一一相乘。

而计算偏导数的公式也不难:

\[\begin{aligned} \frac {\partial}{\partial W^{(l)}} R(W) &= \delta^{(l)} \left( a^{(l - 1)} \right)^T \\ \frac {\partial}{\partial b^{(l)}} R(W) &= \delta^{(l)} \end{aligned} \]

也就是参数更新方式为:

\[\begin{aligned} W^{(l)} &\leftarrow W^{(l)} - \alpha \left( \delta^{(l)} \left( a^{(l - 1)} \right)^T + \lambda W^{(l)} \right) \\ b^{(l)} &\leftarrow b^{(l)} - \alpha \delta^{(l)} \end{aligned} \]

但是值得注意的是,一般我们都会将 \(W^{(l)}\) 的第一列作为 \(b^{(l)}\),也就是不分开,所以在代码实现上要好生注意!

这是吴恩达机器学习 ex4 的部分代码:

function [J grad] = nnCostFunction(nn_params, ...input_layer_size, ...hidden_layer_size, ...num_labels, ...X, y, lambda)% Theta1 25 x 401
% Theta2 10 x 26Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...hidden_layer_size, (input_layer_size + 1));Theta2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end), ...num_labels, (hidden_layer_size + 1));temp1 = Theta1;
temp2 = Theta2;
temp1(:, 1) = 0;
temp2(:, 1) = 0;m = size(X, 1);J = 0;
Theta1_grad = zeros(size(Theta1));
Theta2_grad = zeros(size(Theta2));% forward propagation
A2 = sigmoid([ones(m, 1) X] * Theta1'); % m x 25
A3 = sigmoid([ones(m, 1) A2] * Theta2'); % m x 10% caculate cost
Y = zeros(m, num_labels);
for i = 1:mY(i, y(i)) = 1;
end
J -= sum(sum( log(A3) .* Y + log(1 - A3) .* (1 - Y) ));
J += lambda / 2 * (sum(sum(temp1 .* temp1)) + sum(sum(temp2 .* temp2)));
J /= m;% Back PropagationD1 = zeros(size(Theta1));
D2 = zeros(size(Theta2));for i = 1:ma1 = X(i, :); % 1 x 400a2 = A2(i, :); % 1 x 25a3 = A3(i, :); % 1 x 10y = Y(i, :); % 1 x 10d3 = (a3 - y)'; % 10 x 1d2 = (Theta2' * d3) .* [1 a2]' .* (1 - [1 a2])'; % 26 x 1d2 = d2(2:end) ; % 25 x 1D1 += d2 * [1 a1];D2 += d3 * [1 a2];
endTheta1_grad = (D1 + lambda * temp1) / m;
Theta2_grad = (D2 + lambda * temp2) / m;% Unroll gradients
grad = [Theta1_grad(:) ; Theta2_grad(:)];end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/721782.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置并集集成Sentinel微服务保护

Sentinel 微服务保护的技术有很多,但在目前国内使用较多的还是Sentinel,所以接下来我们学习Sentinel的使用。 介绍和安装 Sentinel是阿里巴巴开源的一款服务保护框架,目前已经加入SpringCloudAlibaba中。官方网站: https://sentinelguard.io/zh-cn/Sentinel 的使用可以分为…

设计模式:命令模式(Command Pattern)及实例

好家伙,0.什么是命令模式 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。 但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。 在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组…

gRPC入门学习之旅(十)

gRPC是一个高性能、通用的开源远程过程调用(RPC)框架,基于底层HTTP/2协议标准和协议层Protobuf序列化协议开发, gRPC 客户端和服务端可以在多种环境中运行和交互。你可以用Java创建一个 gRPC 服务端,用 Go、Python、C# 来创建客户端。本系统文章详细描述了如何创建一个自己…

WPS使用技巧|word

分享 WPS word文档的编辑技巧代码 代码高亮 推荐工具:https://highlightcode.com 我们把需要插入的代码复制上去,再点击右上角的 高亮代码把代码复制到WPS即可 效果演示:本文将持续更新……

面向对象程序设计-第4-6次大作业总结

前言 有了三次大作业的经验,即使在面对新的大作业时谈不上得心应手,但也有了一些思路以及应对难点的方法,总归是有了一些心得体会,不会被复杂的测试点和样例搞得捉襟见肘,这也未尝不算进步。 1.知识点 这三次大作业的知识点相较于前几次来说更加复杂,更加专业化,涉及到了…

2024年5月文章一览

2024年5月编程人总共更新了7篇文章: 1.2024年4月文章一览 2.《自动机理论、语言和计算导论》阅读笔记:p215-p351 3.《自动机理论、语言和计算导论》阅读笔记:p352-P401 4.《自动机理论、语言和计算导论》阅读笔记:p402-p427 5.《自动机理论、语言和计算导论》阅读笔记:p42…

BUUCTF-WEB(66-70)

[MRCTF2020]套娃 参考: MRCTF2020 套娃 - Rabbittt - 博客园 (cnblogs.com) upfine的博客 (cnblogs.com) 查看源码然后我这里查一下$_SERVER的这个用法然后这边的意思就是里面不能用_和%5f(URL编码过的下划线) 然后传入b_u_p_t里面这个参数有下划线,我们想办法绕过 substr_cou…

告别Word,用Python打造你的专业简历!

今天给大家介绍下一个在纯 python 中构建简历的实用工具,工具的连接地址https://github.com/koek67/resume-builder/blob/main/readme.md 用法介绍 要求 Python 3.7 或更高版本(仅此而已!) 安装 整个库是一个单独的 python 文件 resume_builder.py。下载此文件 用法 要生成…

某大型医院IBM 3650服务器 raid重组案例——数据完美修复

我们今天谈的是一个来自四川的大型三甲医院的服务器数据恢复的真实的一个案例,是一台IBM的3650服务器,一共六块硬盘坏了,有两块硬盘是300GB,一共是有六块盘,两块盘是曝光灯离线了,导致这个医院的挂号系统,诊疗系统全部瘫痪,所有数据全部丢失,医院属于一个停摆的状态,…

数据库镜像 (SQL Server)操作模式

数据库镜像会话以同步操作或异步操作运行。 在异步操作下,事务不需要等待镜像服务器将日志写入磁盘便可提交,这样可最大程度地提高性能。 在同步操作下,事务将在伙伴双方处提交,但会延长事务滞后时间。 有两种镜像运行模式。 一种是高安全性模式,它支持同步操作。 在高安全…

Block Transformer:通过全局到局部的语言建模加速LLM推理

在基于transformer的自回归语言模型(LMs)中,生成令牌的成本很高,这是因为自注意力机制需要关注所有之前的令牌,通常通过在自回归解码过程中缓存所有令牌的键值(KV)状态来解决这个问题。但是,加载所有先前令牌的KV状态以计算自注意力分数则占据了LMs的推理的大部分成本。…