4-打开神经网络的大门
1. 神经网络的认识
用图来表示神经网络的话,如下图所示。我们把最左边的一列称为 输入层,最右边的一列称为输出层,中间的一列称为中间层,有时也称为隐藏层。
另外,也把 输入层 到 输出层 依次称为第0层、第 1层、第2层
2. 激活函数
激活函数是连接感知机和神经网络的桥梁。
像感知机原理公式
y
=
{
0
(
b
+
ω
1
x
1
+
ω
2
x
2
≤
0
)
(
2.1
)
1
(
b
+
ω
1
x
1
+
ω
2
x
2
>
0
)
y=
y=⎩⎪⎨⎪⎧01(b+ω1x1+ω2x2≤0)(b+ω1x1+ω2x2>0)(2.1)
可以转换为
h
(
x
)
=
{
0
x
≤
0
(
2.2
)
1
x
>
0
h(x)=
h(x)=⎩⎪⎨⎪⎧01x≤0x>0(2.2)
h
(
x
)
h(x)
h(x)将输入信号的总和转换为输出信号,这样的函数就叫做激活函数
式(2.2)表示的激活函数以阈值为界,一旦输入超过阈值,就切换输出。 这样的函数称为“阶跃函数, 也就是说,在激活函数的众多候选函数中,感知机使用了阶跃函数。
2.1 其他激活函数
-
sigmoid
函数 (sigmoid function)h ( x ) = 1 1 + e − x h(x)=\frac{1}{1+e^{-x}} h(x)=1+e−x1
神经网络中用
sigmoid
函数作为激活函数,进行信号的转换,转换后的信号被传送给下一个神经元。实际上,上一章介绍的感知机和接下来要介绍的神经网络的主要区别就在于这个激活函数。其他方面,比如神经元的多层 连接的构造、信号的传递方法等,基本上和感知机是一样的。
-
阶跃函数的实现
def step_function(x): if x > 0: return 1 else: return 0
这个实现简单、易于理解,但是参数x只能接受实数(浮点数)。
也就是 说,允许形如 step_function(3.0) 的调用,但不允许参数取NumPy数组,例如:step_function(np.array([1.0, 2.0]))。
为了便于后面的操作,我们把它修 改为支持NumPy数组的实现:
代码1
def step_function(x): y = x > 0 return y.astype(np.int)
由于使用了NumPy中的“技巧”,可能会有 点难理解,下面同过python解释器解释一下:
代码2
>>> import numpy as np >>> x = np.array([-1.0, 1.0, 2.0]) >>> x array([-1., 1., 2.]) >>> y = x > 0 >>> y array([False, True, True], dtype=bool)
数组的各个元素都进行了不等号运算, 生成一个布尔型数组(y),接下来,再把数组y的元素类型从布尔型转换为int型。
代码3
>>> y = y.astype(np.int) >>> y array([0, 1, 1])
这样,像 代码1 就用python实现了一个阶跃函数。
-
sigmoid函数的实现
def sigmoid(x): #x可以是一个数字,也可以是numpy数组 y = 1 / (1 + np.exp(-x)) #因为numpy数组具有广播功能 return y
-
sigmoid函数和阶跃函数的比较
-
异性
-
“平滑性”`不同:
-
sigmoid函数是一条平滑的曲线,输出随着输入发生连续性的变化。
-
而阶跃函数以0为界,输出发 生急剧性的变化。
-
sigmoid函数的平滑性对神经网络的学习具有重要意义。
-
-
感知机中神经元之间流动的是0或1的二元信号,而神经网络中流动的是连续的实数值信号。
共性:
- 从宏观视角看,可以发现它们具有相似的形状。实际上,两者的结构均是“输入小时,输出接近0(为 0),随着输入增大,输出向1靠近(变成1)。
- 还有一个共同点是,不管输入信号有多小,或者有多大,输出信号的值都在0到1之间。
- 两者均为非线性函数。
[ 非 线 性 函 数 ] 神 经 网 络 的 激 活 函 数 必 须 使 用 非 线 性 函 数 。 因 为 使 用 线 性 函 数 的 话 , 加 深 神 经 网 络 的 层 数 就 没 有 意 义 了 。 为 什 么 这 么 说 , 线 性 函 数 的 问 题 在 于 , 不 管 如 何 加 深 层 数 , 总 是 存 在 与 之 等 效 的 “ 无 隐 藏 层 的 神 经 网 络 ” 。 ( 稍 微 直 观 地 ) 理 解 这 一 点 , 我 们 来 思 考 下 面 这 个 简 单 的 例 子 。 这 里 我 们 考 虑 把 线 性 函 数 h ( x ) = c x 作 为 激 活 函 数 , 把 y ( x ) = h ( h ( h ( x ) ) ) 的 运 算 对 应 3 层 神 经 网 络 A 。 这 个 运 算 会 进 行 y ( x ) = c × c × c × x 的 乘 法 运 算 , 但 是 同 样 的 处 理 可 以 由 y ( x ) = a x ( 注 意 , a = c 3 ) 这 一 次 乘 法 运 算 ( 即 没 有 隐 藏 层 的 神 经 网 络 ) 来 表 示 。 如 本 例 所 示 , 使 用 线 性 函 数 时 , 无 法 发 挥 多 层 网 络 带 来 的 优 势 。 因 此 , 为 了 发 挥 叠 加 层 所 带 来 的 优 势 , 激 活 函 数 必 须 使 用 非 线 性 函 数 [非线性函数]\\ 神经网络的激活函数必须使用非线性函数。因为使用线性函数的话,\\ 加深神经网络的层数就没有意义了。 为什么这么说,线性函数的问题\\ 在于,不管如何加深层数, 总是存在与之等效的“无 隐藏层的神经网络”。\\ (稍微直观地)理解这一点,我们来思 考下面这个简单的例子。 这里我们\\ 考虑把线性函数h(x) = cx作为激活 函数, 把y(x) = h(h(h(x)))的运算\\对应3层神经网络A。 这个运算会进行 y(x) = c×c×c×x的乘法运算,\\ 但是同样的处理可以由y(x) = ax(注意,a = c^3) 这一次乘法运算(即没\\ 有隐藏层的神经网络)来表示。 如本例所示, 使用线性函数时,无法发挥多层\\网络带来的优势。 因此,为了发挥叠加层所 带来的优势,激活函数必须使用\\非线性函数 [非线性函数]神经网络的激活函数必须使用非线性函数。因为使用线性函数的话,加深神经网络的层数就没有意义了。为什么这么说,线性函数的问题在于,不管如何加深层数,总是存在与之等效的“无隐藏层的神经网络”。(稍微直观地)理解这一点,我们来思考下面这个简单的例子。这里我们考虑把线性函数h(x)=cx作为激活函数,把y(x)=h(h(h(x)))的运算对应3层神经网络A。这个运算会进行y(x)=c×c×c×x的乘法运算,但是同样的处理可以由y(x)=ax(注意,a=c3)这一次乘法运算(即没有隐藏层的神经网络)来表示。如本例所示,使用线性函数时,无法发挥多层网络带来的优势。因此,为了发挥叠加层所带来的优势,激活函数必须使用非线性函数
-
ReLU
函数h ( x ) = { x x > 0 0 x ≤ 0 h(x)= h(x)={x0x>0x≤0
python实现:
def relu(x): #x 可以是一个数字、列表、numpy数组 return np.maximum(0, x)
maximum()
函数会从输入的数值中选 择较大的那个值进行输出。
补充一个实现阶跃函数的方法:
使用 map()
函数
例如:
x = [-1,1,2,3,-4,0,-3]
y = map(lambda a: 1 if a > 0 else 0, x)
print(list(y))
#输出:
[0, 1, 1, 1, 0, 0, 0]
本文来自博客园,作者:aJream,转载请记得标明出处:https://www.cnblogs.com/ajream/p/15383613.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人