我觉得GPT老师的语言功底比大多数的博客主要好(包括我自己),阅读起来更易理解,而且哪里不明白还可以直接问gpt老师,孜孜不倦,尽心尽责,全天待命,究极贴心。有这么厉害的一个老师,不学习简直暴殄天物。
于是乎我准备立一个flag,挑战跟着GPT老师学习365天,每天我都会整理自己的学习心得和脉络(文字大部分都是GPT直接生成的,我觉得比我自己写肯定好多了)感谢gpt老师!跪谢
全系列文章: 跟着GPT学习-AI系列
本文参考视频:3Blue1Brown - But what is a Neural Network?
🧠 什么是神经网络?
神经网络是一种模仿大脑神经元结构的软件,用于解决复杂的模式识别问题。其工作原理类似于人类通过观察和学习来识别和理解信息。
- 输入层:接收输入数据(如图像像素)。
- 隐藏层:处理和提取数据中的特征。
- 输出层:生成最终的预测结果。
使用图层的原因
在神经网络的图示中,我们通常会看到一层中的每个神经元通过连接线与下一层中的每个神经元相连。这些连接线表示每个神经元的激活值(输出值)如何影响下一层神经元的激活值。这种连接的强度决定了神经网络作为信息处理机制的有效性和智能性。我们希望通过分层结构使神经网络能够智能地处理信息。具体来说,我们希望每一层的神经元能够提取并组合数据中的特征,从而在最终层产生准确的预测。
中间层的作用
中间层,也称为隐藏层,负责分解和处理输入数据。它们在以下几个方面发挥重要作用:
- 特征提取:每一层逐步提取更高级别的特征。
- 模式识别:识别输入数据中的模式和子结构。
- 信息整合:将低层次特征整合为更高级别的抽象表示。
识别数字的分层处理
在识别手写数字时,我们的目标是将数字分解为更小的、可识别的子部分,如环和线。
第三层:
理想情况下,第三层中的每个神经元都应该与这些子组件之一相对应。例如,当输入带有顶部循环的图像时,特定的神经元会被激活,其激活值接近1.0。这种激活不仅限于特定的像素模式,而是任何一般的循环模式都能触发该神经元。
在第三层到最后一层的过渡中,我们需要学习哪些子组件的组合对应于哪些数字。这种学习过程需要网络逐层提取特征,并最终在输出层给出准确的预测。
子问题的分解
识别环的子问题
识别一个环可以分解为识别构成该环的各种边。这是一种将复杂问题分解为更小、更可管理子问题的方法。
识别长线
长线(如数字1、4或7中的长线)实际上可以视为由多个小边组成的特定图案。这些小边的组合形成了我们识别的长线。
网络第二层
我们希望网络第二层中的每个神经元都与某个小边缘相对应。当图像输入时,相关的小边缘神经元会被激活。这些神经元的激活会进一步点亮与更大模式(如环和长线)相关的第三层神经元,最终在输出层中激活与相应数字相对应的神经元。
这种分层处理的方法需要神经网络逐层学习如何提取和组合特征,从而在最终层给出准确的预测。这不仅是神经网络智能性的核心,也是其在处理复杂模式识别任务时的强大之处。
信息如何在各层中传递
在神经网络中,一层的每个神经元通过连接线与下一层的每个神经元相连。这些连接线表示每个神经元的激活值(输出值)如何影响下一层神经元的激活值。这种连接的强度决定了神经网络作为信息处理机制的有效性和智能性。我们希望通过分层结构使神经网络能够智能地处理信息。具体来说,每一层的神经元能够提取并组合数据中的特征,从而在最终层产生准确的预测。
假设我们希望第二层中的某个特定神经元能够判断图像在某个特定位置是否有边缘。为了实现这个目标,我们需要设置适当的权重和偏差,使得神经元能够检测到特定的像素模式。我们为神经元和第一层的每个神经元之间的每个连接分配一个权重。权重只是一些数字,表示第一层的神经元与第二层的新神经元的相关性。
- 正权重:如果第一层的神经元激活,则正权重使第二层的神经元也激活。
- 负权重:如果第一层的神经元激活,则负权重使第二层的神经元不激活。
这些权重会相互作用,并通过计算加权和来确定第二层神经元的激活值。要实际计算第二层神经元的激活值,需要获取第一层神经元的所有激活值,然后计算它们的加权和。
公式如下:
我们可以将权重想象成一个28x28的网格,每个权重与784个输入像素中的一个相关联。蓝色像素表示正权重,红色像素表示负权重,亮度表示权重值的大小。
通过将与几乎所有像素相关的权重设为0,除了我们想要检测边缘的区域中与这些像素相关的一些正权重,可以增强该区域的检测效果。此外,通过在上方和下方添加一些负权重,我们可以确保当像素的窄边缘打开但周围像素为暗时,神经元最活跃。
偏差的作用
加权和的结果可以是任意数字,但我们希望激活值在0到1之间。为此,我们通常将加权和泵入一个函数中,将其压缩到0到1之间的范围内。常见的函数是“S型”函数(sigmoid函数),表示为:
- 非常负的输入:最终接近于0。
- 非常正的输入:最终接近于1。
有时,我们希望神经元只有在加权和大于某个阈值时才有意义地活跃。为此,我们会添加一个偏差值,使得加权和需要达到某个值(例如-10)才能激活神经元。因此,权重决定了第二层中的神经元正在拾取什么像素模式,而偏差决定了在神经元有意义地活跃之前,加权和需要有多大。
神经元的数量
这还只是一个神经元!第二层中的每个其他神经元也将与第一层的所有784个神经元建立加权连接。每个神经元也有一些偏差,需要添加到加权和中。这意味着需要考虑大量的参数。对于一个有16个神经元的隐藏层,需要784x16个权重和16个偏差。其他层之间的连接也有许多权重和偏差。
总而言之,这个网络共有13,002个权重和偏差。这些参数需要通过训练进行优化,以解决特定的任务。
有一个有趣的思想实验是想象手动设置所有这些权重和偏差。通过目的地设置权重,使第二层拾取边缘,第三层拾取图案,等等。这样做的好处是可以更好地理解神经网络的内部工作原理,而不是将其视为一个完全的黑匣子。当网络的表现不如预期时,通过理解这些权重和偏差的作用,可以更好地调整结构以改进性能。当网络工作正常但原因并非预期时,深入研究权重和偏差的作用,可以挑战假设并揭示可能的解决方案。
公式
简写如下:
🔄 ReLU 和 Sigmoid 的区别
在神经网络中,激活函数是决定网络输出的关键组件。最常用的激活函数包括ReLU(Rectified Linear Unit)和Sigmoid(S型函数)。两者在计算方式、特性以及应用场景上有显著区别。
⚙️ 计算方式
ReLU(Rectified Linear Unit)
ReLU的计算公式:
这意味着如果输入值大于0,则输出与输入相同;如果输入值小于或等于0,则输出为0。
Sigmoid(S型函数)
Sigmoid的计算公式:
特性
- 非常负的输入 xxx 会导致输出接近于0。
- 非常正的输入 xxx 会导致输出接近于1。
- 输入 xxx 在0附近时,输出会在0到1之间平滑过渡。
ReLU
非线性:虽然看起来简单,但ReLU是非线性的,有助于引入非线性特性。 稀疏激活:由于负值被截断为0,ReLU能产生稀疏激活(很多神经元的输出为0)。
Sigmoid
- 平滑曲线:Sigmoid函数输出值在0到1之间平滑过渡。
- 梯度消失问题:在输入值非常大或非常小时,Sigmoid函数的梯度会变得非常小,容易导致梯度消失问题。
- 输出范围受限:Sigmoid函数的输出总是介于0到1之间,这在某些应用中是有益的,例如需要概率输出时。
- 计算效率高:ReLU计算非常简单,只需取最大值,因此计算效率很高。
- 梯度消失问题少:ReLU相较于Sigmoid,更不容易出现梯度消失问题。
🛠 应用场景
ReLU
- 隐藏层神经元:ReLU广泛用于深度神经网络的隐藏层,因为其计算效率高,并且有助于缓解梯度消失问题。
- 卷积神经网络(CNN):ReLU在CNN中尤其常见,因为其稀疏激活特性有助于提高计算效率和模型性能。
Sigmoid
- 输出层神经元:Sigmoid常用于二分类问题的输出层,因为其输出范围在0到1之间,可以很好地表示概率。
- 简单网络:在较浅的神经网络中,Sigmoid可能仍然有用,但在深层网络中,其梯度消失问题会成为主要障碍。