课程1. 深度学习简介

news/2025/2/25 15:26:07

课程1. 深度学习简介

  • 神经网络结构
    • 逻辑回归
      • XOR问题(异或问题)
    • 中间特征的生成
    • 全连接神经网络
      • 中间网络层的激活函数
        • Sigmoid函数
        • Tanh函数
        • ReLU函数
        • 其它激活函数
      • 使用全连接神经网络解决 XOR 问题
      • 神经网络用于回归问题
      • 训练神经网络
    • 不同类型的神经网络
  • 附加材料
    • 人工和生物神经元与神经网络的类比

神经网络结构

在本讲座中,我们将了解人工神经网络的结构及其训练原理。

神经元和神经网络的结构可以从两个方面来讨论:

  • 将人工神经元视为生物神经元的模型。这种类比并不是很严格,因为虽然人工神经元在概念上与生物神经元相似,但它并不能完全模拟生物神经元。此外,人工神经网络的结构有几个特点,使得它与生物神经网络有很大不同。
  • 第二种选择是数学的,更为严格。这里将神经元和整个神经网络视为逻辑回归模型的泛化。通过这种方法,我们就能清楚地知道为什么神经网络的结构是这样的。

在本讲座中,我们将考虑第二种选择。
我们将通过回顾逻辑回归的结构开始从逻辑回归到神经网络的旅程。

逻辑回归

逻辑回归是一种解决二元分类问题的模型。

让我们考虑这个问题:利用有关一个人的信息,确定他是否会在不久的将来患上心血管疾病。让我们下载此任务的训练和测试数据并查看它们:

python">! pip install wldhx.yadisk-direct
! curl -L $(yadisk-direct https://disk.yandex.com/d/nV8yH0zpMzYQ5g) -o ssz_train.csv
! curl -L $(yadisk-direct https://disk.yandex.com/d/rxee3m6enl80zA) -o ssz_test.csv

输出:
在这里插入图片描述

python">import pandas as pd

train_data = pd.read_csv('ssz_train.csv')
test_data = pd.read_csv('ssz_test.csv')

train_data.head()

输出:
在这里插入图片描述
逻辑回归为数据的每个特征分配一个系数。令 k i k_i ki 表示数据集第 i i i 个特征对应的系数。另外,还有一个额外的系数 k 0 k_0 k0,它与任何特征都不对应。它被称为常数

逻辑回归使用以下公式计算对输入元素 X = ( x 1 , x 2 , x 3 , . . . , x k ) X = (x_1, x_2, x_3, ..., x_k) X=(x1,x2,x3,...,xk) 的响应:

y ^ = σ ( ∑ k i x i + k 0 ) \widehat{y} = \sigma(\sum k_i x_i + k_0) y =σ(kixi+k0)

这里 σ \sigma σ 是 S 型激活函数。
它以输入元素属于类 1 的概率的形式给出答案。

对数回归的训练包括寻找参数 k i k_i ki的最优值。

对数回归可以表示如下:
在这里插入图片描述
让我们在数据集上训练对数回归。我们将数据分成一个特征和一个目标变量:

python">y_train = train_data['cardio']
X_train = train_data.drop(columns=['cardio'])

y_test = test_data['cardio']
X_test = test_data.drop(columns=['cardio'])

让我们导入训练数据并训练对数回归:

python">from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()
lr.fit(X_train, y_train)

我们来看看对数回归学习到的系数:

python">lr.coef_, lr.intercept_

输出:
在这里插入图片描述

python">lr.score(X_test, y_test)

输出:
0.6925833333333333

现在让我们回想一下对数回归的几何意义,并理解逻辑回归是一种相当弱的算法。作为决策规则,对数回归构建了一个线性超平面,将一个类的元素与第二个类的元素分开。当数据集中只有两个特征时,线性超平面是一条直线。在这里插入图片描述

如果我们的数据集只有两个特征,那么数据集元素可以在平面上描绘为点。 X 轴对应第一个特征的值,Y 轴对应第二个特征的值。根据点是属于零类还是一类,它们被染成两种颜色。

现在我们再看一下对数回归公式:

y ^ = σ ( ∑ k i x i + k 0 ) \widehat{y} = \sigma(\sum k_i x_i + k_0) y =σ(kixi+k0)

对数回归公式中 S 形函数内部的部分,从几何角度看,反映的是平面上的一条直线。并且在训练期间,对数回归选择这样的系数 k k k,使得该线能够最好地将平面上的两个类别的点分开。

事实上,对数回归表达的是直线,这使得它无法很好地处理那些点不能线性分离的数据。例如,假设我们的数据集中的点排列如下:
在这里插入图片描述
无论你在这里画什么线,它都无法很好地区分不同类别的点。在这种情况下,数据被称为线性不可分

在这种情况下,我们希望我们的模型更加“灵活”:以便它能够表达比直线更复杂的功能。

XOR问题(异或问题)

回想一下,XOR 问题是标准线性回归模型无法分离数据的一个典型例子。它的名字指的是 XOR 函数,通常通过以下关系描述(对于两个二进制变量 x 1 x_1 x1 x 2 x_2 x2):

x 1 x_1 x1 x 2 x_2 x2 X O R ( x 1 , x 2 ) XOR(x_1, x_2) XOR(x1,x2)
000
011
101
110

这样的数据不能线性划分,即不可能构建一条线来分隔 X O R XOR XOR 函数取值 0 的点和 X O R = 1 XOR=1 XOR=1 的点。

然后,让我们尝试将这个问题推广到任意特征,并尝试使用逻辑回归来解决它。

让我们生成数据:

python">import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme()
rng = np.random.RandomState(0)

# 定义一个由 4 个簇组成的合成点集
X1 = rng.randn(50, 2) + np.array([4,4])
X2 = rng.randn(50, 2) + np.array([-4,4])
X3 = rng.randn(50, 2) + np.array([4,-4])
X4 = rng.randn(50, 2) + np.array([-4,-4])
X = np.concatenate([X1,X2,X3,X4])
y = np.logical_xor(X[:, 0] > 0, X[:, 1] > 0)
plt.figure(figsize=(15,10))
plt.scatter(X[:, 0], X[:, 1], s=30, c=y, cmap=plt.cm.coolwarm);

输出:
在这里插入图片描述
让我们尝试建立一个逻辑回归并描述其输出的强度(即根据该模型的预测,某个点属于类“1”的概率)。

python">def plot_boundary(clf, X, y, plot_title):
  """
  以图形方式显示线性模型的输出强度的函数
  """
  x_mesh, y_mesh = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
  clf.fit(X, y)
  Z = clf.predict_proba(np.vstack((x_mesh.ravel(), y_mesh.ravel())).T)[:, 1]
  Z = Z.reshape(x_mesh.shape)

  b1 = x_mesh.min()
  b2 = x_mesh.max()
  b3 = y_mesh.min()
  b4 = y_mesh.max()

  image = plt.imshow(Z, interpolation='nearest', extent=(b1, b2, b3, b4), aspect='auto', origin='lower', cmap=plt.cm.PuOr_r)
  contours = plt.contour(x_mesh, y_mesh, Z, levels=[0], linewidths=2, linetypes='--');
  plt.scatter(X[:, 0], X[:, 1], s=30, c=y, cmap=plt.cm.coolwarm)
  plt.xticks(())
  plt.yticks(())
  plt.axis([-8, 8, -8, 8])
  plt.colorbar(image)
  plt.title(plot_title, fontsize=20);
python">from sklearn.linear_model import LogisticRegression

plt.figure(figsize=(15,10))
plot_boundary(LogisticRegression(), X, y,
"Logistic Regression, XOR problem")

输出:
在这里插入图片描述

中间特征的生成

让我们思考如何解决这个问题:如何使对数回归算法更加灵活,能够适应数据中更复杂的依赖关系。

现在我们接收传入元素的响应的管道(算法)如下所示:我们将数据集元素的特征输入到模型的输入中,并使用公式得到答案。
在这里插入图片描述

让我们这样做:在将特征提供给模型输入之前,让我们尝试修改这些特征,使它们变得线性可分离。让我们通过某些函数运行它们,以便数据集元素的特征值以这样一种方式发生变化,即平面上的点变得可以使用直线分离,即使用对数回归。
在这里插入图片描述
事实证明,对于某些类型的特征,可以选择函数,使得应用这些函数后,变换后的特征实际上变得可以很好地分离。这样的函数被称为,而使用核来变换特征被称为核技巧。通常,核将特征转换到更高维的空间,也就是说,它们增加了数据集中的特征数量。例如,从两个符号可以得到三个。
在这里插入图片描述

由于这样的操作,当有两个特征时,那些最初在平面上不可分离的元素,现在当有三个特征时,在空间中变得线性可分离。

然而,内核是固定函数。在某些情况下它们效果很好,但在其他情况下效果不佳。但是不可能选择某个固定的“通用”内核来始终使得数据集的元素线性可分。因此,我想提出一些更灵活、更通用的方法来转换特征,以便无论数据集如何,都可以使元素线性可分离。

这个想法是这样的:如果特征的转换也是可训练的会怎样?创建一些类似的机器学习模型,其目的是将元素的特征作为输入,并基于这些特征输出该元素的新特征。通过对数回归已经可以很好地划分样本。也就是说,这些将是这样的学习核心。

在这里插入图片描述
在这里插入图片描述

全连接神经网络

因此,我们得到了以下设计:
在这里插入图片描述
这就是我们从改进对数回归模型的思路中得到了一个具有任意数量隐藏层的全连接神经网络

矩阵形式的公式:

y ^ = σ ( W 3 σ ( W 2 T σ ( W 1 T X + b 1 ) + b 2 ) + b 3 ) \widehat{y} = \sigma(W_3 \sigma(W_2^T \sigma(W_1^TX + b_1 ) + b_{2}) + b_{3}) y =σ(W3σ(W2Tσ(W1TX+b1)+b2)+b3)

一般情况下,当网络中有 k k k 层时:

y ^ = σ ( W k T σ ( W k − 1 T σ ( … ( W 1 T X + b 1 ) … ) + b k − 1 ) + b k ) \widehat{y} = \sigma(W_k^T \sigma(W_{k-1}^T \sigma(\dots(W_1^T X + b_1) … ) + b_{k-1}) + b_{k}) y =σ(WkTσ(Wk1Tσ((W1TX+b1))+bk1)+bk)

为某项任务训练这样的神经网络的过程包括寻找所有对数回归的所有参数的最优值。所有对数回归都是联合训练的。它们的权重相互调整,使得整个最终模型能够很好地解决任务。

还值得一提的是,通常直到最后一层的整个网络部分被称为特征提取器,而最后一层被称为分类器。这与我们从逻辑回归构建完全连接网络的方式一致:网络的最后一层实际上是对数回归本身,所有其他层都是特征转换器,用于将它们馈送到最后一个对数回归层的输入。
在这里插入图片描述
在我们了解神经网络权重究竟是如何训练之前,我们先来关注以下两件事:

中间网络层的激活函数

因此,我们知道神经网络是由通过权重相互连接的多层神经元组成的。每个神经元都表达一种功能

σ ( ∑ i = 0 k x i k i + k 0 ) \sigma \left( \sum_{i=0}^{k} x_ik_i + k_0 \right) σ(i=0kxiki+k0)

在这里插入图片描述
神经元的 σ \sigma σ函数称为神经元的激活函数。在我们的神经网络中, σ \sigma σ 是一个 S 型函数,就像逻辑回归一样。但是全连接神经网络中的神经元可以有不同的激活函数,而不仅仅是S形。在本节中,我们将介绍一些实践中常用的激活函数。

但在此之前,需要注意以下有关激活函数的问题:

  1. 网络某一层的所有神经元都使用相同的激活函数。这是由于神经网络根据输入的输出是以矩阵形式计算的:
    y ^ = σ ( W k T σ ( W k − 1 T σ ( . . . ) + b k − 1 ) + b k ) \widehat{y} = \sigma(W_k^T \sigma(W_{k-1}^T \sigma(... ) + b_{k-1}) + b_{k}) y =σ(WkTσ(Wk1Tσ(...)+bk1)+bk)
    并且将激活函数直接作用于每一层的输出向量而不是分别作用于每个神经元更加方便。

  2. 网络每一层之后都需要激活函数。没有必要制作没有激活函数的网络层。
    这是因为激活函数里面的网络层公式是线性函数。而如果网络中两个连续的层之间没有激活函数,那么它们就是两个线性函数的组合,这也是一个线性函数。那些。两个连续的网络层,如果它们之间没有激活函数,则等效于一个网络层。为了使网络的两个连续层表达比线性函数更复杂的函数,它们之间必须有一个激活函数。
    正因为如此,激活函数也被称为非线性的:它在网络公式中添加了一个非线性成分。

  3. 如果我们正在解决二分类问题,那么神经网络的最后一层必须具有 S 型激活函数(因为事实上,最后一层是对数回归,它解决了二分类问题)。并且在网络的隐藏层中可能已经存在其他激活函数。

现在让我们看一下完全连接神经网络的隐藏层中使用的一些流行的激活函数。

Sigmoid函数

在我们得到的神经网络模型中,S 型函数被用作中间层的激活函数:

σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1

其图形及其导数的图形:
在这里插入图片描述
这是因为我们根据逻辑回归构建了神经网络。然而,对于神经网络的隐藏层来说,这种激活函数的选择并不是最佳的。这是由于 S 形导数的性质所致。正如我们稍后会看到的,衍生品在训练神经网络中起着关键作用。您可以在此处阅读有关 S 型函数作为激活函数的缺点的更多信息。

用什么来代替 S 形?激活函数有很多种类型,可用于不同的神经网络。其中最受欢迎的是:

Tanh函数

切线激活函数已经取代了 S 形函数,并且长期以来一直被用作网络隐藏层的通用激活函数。但是它也存在很大的缺点,其中很多缺点与 S 型函数的性质相同。
在这里插入图片描述

ReLU函数

ReLU是如今可以称得上“万能”的一个激活函数。大多数情况下它效果很好。它没有sigmoid和tanh的缺点,而且它和它的导数计算起来要容易得多。
在这里插入图片描述

默认情况下,神经网络隐藏层应该使用的函数是ReLU。

其它激活函数

除了 sigmoid、tanh、ReLU 之外,还有其他激活函数。例如,Leaky ReLu、ELU(ReLU 的修改)、Swish 等。其中许多有助于解决某些问题。您可以阅读其中一些内容 这里。

使用全连接神经网络解决 XOR 问题

现在让我们尝试使用完全连接的神经网络来解决 XOR 问题。让我们使用 ReLU 激活函数构建一个具有一个隐藏层和三个神经元的网络:

python">from sklearn.neural_network import MLPClassifier

mlp = MLPClassifier(hidden_layer_sizes=(3,), activation='relu', solver='sgd', max_iter=5000, random_state=42)
mlp.fit(X, y)

输出:
在这里插入图片描述

python">plt.figure(figsize=(15,10))
plot_boundary(mlp, X, y,
"XOR problem solution")

输出:
在这里插入图片描述

python">mlp.coefs_, mlp.intercepts_

输出:
在这里插入图片描述

神经网络用于回归问题

到目前为止,我们一直在讨论二元词汇分类问题。我们根据对数回归建立了一个神经网络,这是一个二元分类问题的模型。但是,当然,借助神经网络,不仅可以解决这个问题,还可以解决其他问题。

经典机器学习中众所周知的问题包括:

  • 回归问题
  • 多类分类问题

为了使完全连接的神经网络适应回归问题,您只需将最后一层的逻辑回归替换为线性回归。也就是说,从最后一层的神经元中去除激活函数。请注意,激活函数必须保留在网络的所有隐藏层中!

下一课我们将讨论多类分类的问题。

训练神经网络

在这里插入图片描述

训练神经网络包括为特定任务寻找网络参数的最优值。

这是什么意思:假设我们有一个数据集。让我们以上面使用的 CVD 数据集为例。

python">train_data.head()

输出:
在这里插入图片描述
假设我们选择了一个损失函数 L L L,并希望将其在数据上最小化。

那么网络训练的任务就是找到这样的网络参数 W 1 , b 1 , W 2 , b 2 , … W_1, b_1, W_2, b_2, \dots W1,b1,W2,b2,,使得损失函数在训练数据集元素上的平均值最小: ∑ i = 1 n L ( y i , y ^ i ) n → m i n \frac{\sum_{i=1}^n L(y_i, \widehat{y}_i)}{n} \to min ni=1nL(yi,y i)min

,其中 n n n是数据中的元素数量, y i y_i yi是第 i i i个数据元素的目标变量的正确值, y ^ i \widehat{y}_i y i是第 i i i个数据元素的模型响应。

神经网络权重的训练是使用梯度下降算法完成的。在本课中,我们不会详细介绍该算法的结构。

不同类型的神经网络

在本课中,我们了解了全连接神经网络的结构。这是开启深度学习历史的经典神经装置。但近年来,人们发明了其他神经网络架构,非常适合解决各种类型的问题。我们将在本课程的课堂上了解其中的一些。然而,值得注意的是,所有其他神经网络架构都是基于与全连接神经网络相同的思想。

一些类型的神经网络:

1)完全连接的神经网络。这些正是我们在今天的讲座中讨论的模型;

2)卷积神经网络。该架构旨在更有效地处理图像;

3)循环神经网络。该架构旨在更有效地处理以序列表示的数据;

4)基于注意力机制的 Transformer。该架构最初是为了机器翻译任务而设计的,其背后的理念已被证明在从图像处理到文本和声音等各种任务中非常有效;

5)图神经网络。这种类型的神经网络在处理具有图形性质的数据时效果很好。例如社交网络图/物质分子等。

附加材料

人工和生物神经元与神经网络的类比

在这里我们将尝试展示如何在人工和生物神经元与神经网络之间进行类比。

首先,让我们概括地描述一下生物神经网络和大脑中单个神经元的结构。让我在这里澄清一下:我对生物过程的描述并不声称是完整和严谨的;我将在非常抽象、意识形态的层面上描述它们。

所以,我们的大脑由数十亿个通过网络相互连接的神经元组成。神经元之间的连接称为突触:信息通过它们传输。神经元彼此之间的连接相当混乱;连接中没有特殊的结构。此外,神经元之间会出现新的连接,而旧的连接则会消失。

每个神经元从一组神经元接收信息并将其传输给另一组神经元。大脑中的信息以电脉冲的形式呈现,因此当神经元接收和传输信息时,电流就会通过它并“亮起来”。

此外,神经元之间的突触具有不同的阻力。连接中的电阻大小决定了从一个神经元流向另一个神经元的电流量。如果阻力很大,第一个神经元释放的冲动只有一小部分能够到达第二个神经元。如果电阻较低,那么几乎整个脉冲都会顺利通过连接。因此,电阻的大小可以被认为是信号的重要性:来自第一个神经元的信号对于第二个神经元有多重要。

这就是大脑神经元之间信息传递过程的一般运作方式。
在这里插入图片描述
现在让我们更详细地讨论单个生物神经元的结构。一般来说,一个神经元有三个组成部分:树突、轴突和膜
在这里插入图片描述

树突是神经元的输入,神经元通过它接收来自大脑中其他神经元的信息。

膜和细胞质中,通过树突接收的信息被处理:来自其他神经元的所有冲动被加起来,并将总和与某个阈值进行比较。如果总和大于阈值,则神经元被激活,并且信息进一步传输到其他神经元。如果总和小于阈值,则认为接收到的信息无关紧要,神经元不会被激活,也不会沿着网络进一步传输信息。也就是说,冲动逐渐消失。

神经元的最后一个元素是轴突。轴突通过突触与其他神经元的树突相连。正是通过这条通路,一个神经元中积累的信息被传输到下一个神经元。嗯,如果发生了激活,当然可以。

这大致就是生物神经元的结构。现在让我们根据人工神经元的结构建立一个模型。
在这里插入图片描述
圆圈是膜,左边的边缘是突触,来自其他神经元(用灰色圆圈表示)的信息通过突触进入细胞核。右侧的边缘是突触,它将信息传递到网络中其他的神经元。
在计算机中,所有信息都以数字表示。因此,我们的人工神经元将以数字的形式接收和传输信息,而不是像生物神经网络那样以电脉冲的形式。

人工神经元如何处理信息:看,我们的神经元与其他五个神经元相连,它从三个神经元接收信息并将信息传递给两个神经元。让三个传入的神经元向我们的绿色神经元的输入发送大小为十、七和三的脉冲。神经元之间的每个边都有一个权重——某个实数。当来自神经元的信号沿着边缘传递时,该信号会乘以边缘的权重。也就是说,三个信号将到达我们的绿色神经元:十乘以零五、七乘以一和三乘以零一。人工神经元中的边缘权重类似于生物神经网络中神经元之间连接的阻力。然后,在核心内部,这些信号被加在一起形成一个信号:在我们的例子中,它是十二点三。然后将该信号与阈值进行比较。让神经元中的阈值为十。

我们看到,这种人工神经元模型类似于逻辑回归和我们在课堂上讨论的人工神经元。唯一的区别是激活函数。在人工中子网络中,它不是一个阈值。

这就是人们如何将生物和人工神经元与神经网络进行类比。然而,这种类比并不能解释为什么在人工神经网络中神经元被组合成层,并且连接只存在于连续层的神经元之间。但在笔记本电脑的主要部分,幸运的是,我们已经弄清楚了为什么人工网络以这种方式构建。


http://www.niftyadmin.cn/n/5865653.html

相关文章

OpenCV计算摄影学Computational Photography

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算摄影学(Computational Photography)是一门结合了数字图像处理、计算机视觉和光学的交叉学科领域,旨在通过…

GMII(Gigabit Media Independent Interface)详解

一、GMII的定义与作用 GMII(千兆介质无关接口)是用于千兆以太网(1Gbps)的标准化接口,连接 MAC层(数据链路层)与 PHY芯片(物理层)。其核心目标是支持高速数据传输&#x…

MySQL的三种并发问题和四种隔离级别

阅读之前,请心里默念,脏读、不可重复读、幻读是三种常见的并发问题,隔离级别是应对并发问题的四种隔离级别,隔离级别和并发问题是两个东西,不要混淆。 在数据库事务中,脏读(Dirty Read&#xff…

hbase笔记总结1

hbase是nosql的一种,非关系型数据库,not only sql,可处理大规模、高并发的数据,是web2.0以后的产物hbase的扩展性和灵活性更好,而且筛选能力相较于MySQL更优nosql的四大特点: 灵活的数据模型 (1…

数学建模之数学模型—2:非线性规划

文章目录 非线性规划基本概念与结论凸集与凸函数极值条件无约束条件的极值判断条件有约束条件的极值判断条件 无约束非线性规划一维搜索算法步骤示例特点代码模板 最速下降法算法详细步骤 代码实现示例最优步长的求解 黄金分割法斐波那契法牛顿法阻尼牛顿法模式搜索法Powell方法…

玩客云刷机教程Armbian_5.67把你的玩客云改造成一个小型的Linux服务器(保姆级教程)

最近买了一个玩客云,打算用来消耗下行带宽,那么就让我们来记录这个过程吧。 准备材料 1.玩客云主机 2.USB双公线 3.DC5525电源 4.Armbian_5.67_Aml-s805_Debian_stretch_defaultEMMC直刷包(文件来源于网上,点击这里可直接下载…

【学习笔记】LLM+RL

文章目录 1 合成数据与模型坍缩(model collapse),1.1 递归生成数据与模型坍缩1.2 三种错误1.3 理论直觉1.4 PPL指标 2 基于开源 LLM 实现 O1-like step by step 慢思考(slow thinking),ollama,streamlit2.1…

ubuntu安装配置docker

这里不再进行分步解读了,所有操作见下面命令 sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc…