丽水网站建设费用,写作网站都有哪些,网站建设 视频,正定县建设局网站课程1. 深度学习简介 神经网络结构逻辑回归XOR问题#xff08;异或问题#xff09; 中间特征的生成全连接神经网络中间网络层的激活函数Sigmoid函数Tanh函数ReLU函数其它激活函数 使用全连接神经网络解决 XOR 问题神经网络用于回归问题训练神经网络 不同类型的神经网络 附加材… 课程1. 深度学习简介 神经网络结构逻辑回归XOR问题异或问题 中间特征的生成全连接神经网络中间网络层的激活函数Sigmoid函数Tanh函数ReLU函数其它激活函数 使用全连接神经网络解决 XOR 问题神经网络用于回归问题训练神经网络 不同类型的神经网络 附加材料人工和生物神经元与神经网络的类比 神经网络结构
在本讲座中我们将了解人工神经网络的结构及其训练原理。
神经元和神经网络的结构可以从两个方面来讨论
将人工神经元视为生物神经元的模型。这种类比并不是很严格因为虽然人工神经元在概念上与生物神经元相似但它并不能完全模拟生物神经元。此外人工神经网络的结构有几个特点使得它与生物神经网络有很大不同。第二种选择是数学的更为严格。这里将神经元和整个神经网络视为逻辑回归模型的泛化。通过这种方法我们就能清楚地知道为什么神经网络的结构是这样的。
在本讲座中我们将考虑第二种选择。 我们将通过回顾逻辑回归的结构开始从逻辑回归到神经网络的旅程。
逻辑回归
逻辑回归是一种解决二元分类问题的模型。
让我们考虑这个问题利用有关一个人的信息确定他是否会在不久的将来患上心血管疾病。让我们下载此任务的训练和测试数据并查看它们
! 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输出
import pandas as pdtrain_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 σ(∑kixik0)
这里 σ \sigma σ 是 S 型激活函数。 它以输入元素属于类 1 的概率的形式给出答案。
对数回归的训练包括寻找参数 k i k_i ki的最优值。
对数回归可以表示如下 让我们在数据集上训练对数回归。我们将数据分成一个特征和一个目标变量
y_train train_data[cardio]
X_train train_data.drop(columns[cardio])y_test test_data[cardio]
X_test test_data.drop(columns[cardio])让我们导入训练数据并训练对数回归
from sklearn.linear_model import LogisticRegressionlr LogisticRegression()
lr.fit(X_train, y_train)我们来看看对数回归学习到的系数
lr.coef_, lr.intercept_输出
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 σ(∑kixik0)
对数回归公式中 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)000011101110
这样的数据不能线性划分即不可能构建一条线来分隔 X O R XOR XOR 函数取值 0 的点和 X O R 1 XOR1 XOR1 的点。
然后让我们尝试将这个问题推广到任意特征并尝试使用逻辑回归来解决它。
让我们生成数据
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], s30, cy, cmapplt.cm.coolwarm);输出 让我们尝试建立一个逻辑回归并描述其输出的强度即根据该模型的预测某个点属于类“1”的概率。
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, interpolationnearest, extent(b1, b2, b3, b4), aspectauto, originlower, cmapplt.cm.PuOr_r)contours plt.contour(x_mesh, y_mesh, Z, levels[0], linewidths2, linetypes--);plt.scatter(X[:, 0], X[:, 1], s30, cy, cmapplt.cm.coolwarm)plt.xticks(())plt.yticks(())plt.axis([-8, 8, -8, 8])plt.colorbar(image)plt.title(plot_title, fontsize20);from sklearn.linear_model import LogisticRegressionplt.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σ(W1TXb1)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σ(Wk−1Tσ(…(W1TXb1)…)bk−1)bk)
为某项任务训练这样的神经网络的过程包括寻找所有对数回归的所有参数的最优值。所有对数回归都是联合训练的。它们的权重相互调整使得整个最终模型能够很好地解决任务。
还值得一提的是通常直到最后一层的整个网络部分被称为特征提取器而最后一层被称为分类器。这与我们从逻辑回归构建完全连接网络的方式一致网络的最后一层实际上是对数回归本身所有其他层都是特征转换器用于将它们馈送到最后一个对数回归层的输入。 在我们了解神经网络权重究竟是如何训练之前我们先来关注以下两件事
中间网络层的激活函数
因此我们知道神经网络是由通过权重相互连接的多层神经元组成的。每个神经元都表达一种功能 σ ( ∑ i 0 k x i k i k 0 ) \sigma \left( \sum_{i0}^{k} x_ik_i k_0 \right) σ(i0∑kxikik0) 神经元的 σ \sigma σ函数称为神经元的激活函数。在我们的神经网络中 σ \sigma σ 是一个 S 型函数就像逻辑回归一样。但是全连接神经网络中的神经元可以有不同的激活函数而不仅仅是S形。在本节中我们将介绍一些实践中常用的激活函数。
但在此之前需要注意以下有关激活函数的问题 网络某一层的所有神经元都使用相同的激活函数。这是由于神经网络根据输入的输出是以矩阵形式计算的 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σ(Wk−1Tσ(...)bk−1)bk) 并且将激活函数直接作用于每一层的输出向量而不是分别作用于每个神经元更加方便。 网络每一层之后都需要激活函数。没有必要制作没有激活函数的网络层。 这是因为激活函数里面的网络层公式是线性函数。而如果网络中两个连续的层之间没有激活函数那么它们就是两个线性函数的组合这也是一个线性函数。那些。两个连续的网络层如果它们之间没有激活函数则等效于一个网络层。为了使网络的两个连续层表达比线性函数更复杂的函数它们之间必须有一个激活函数。 正因为如此激活函数也被称为非线性的它在网络公式中添加了一个非线性成分。 如果我们正在解决二分类问题那么神经网络的最后一层必须具有 S 型激活函数因为事实上最后一层是对数回归它解决了二分类问题。并且在网络的隐藏层中可能已经存在其他激活函数。
现在让我们看一下完全连接神经网络的隐藏层中使用的一些流行的激活函数。
Sigmoid函数
在我们得到的神经网络模型中S 型函数被用作中间层的激活函数 σ ( x ) 1 1 e − x \sigma(x) \frac{1}{1 e^{-x}} σ(x)1e−x1
其图形及其导数的图形 这是因为我们根据逻辑回归构建了神经网络。然而对于神经网络的隐藏层来说这种激活函数的选择并不是最佳的。这是由于 S 形导数的性质所致。正如我们稍后会看到的衍生品在训练神经网络中起着关键作用。您可以在此处阅读有关 S 型函数作为激活函数的缺点的更多信息。
用什么来代替 S 形激活函数有很多种类型可用于不同的神经网络。其中最受欢迎的是
Tanh函数
切线激活函数已经取代了 S 形函数并且长期以来一直被用作网络隐藏层的通用激活函数。但是它也存在很大的缺点其中很多缺点与 S 型函数的性质相同。
ReLU函数
ReLU是如今可以称得上“万能”的一个激活函数。大多数情况下它效果很好。它没有sigmoid和tanh的缺点而且它和它的导数计算起来要容易得多。
默认情况下神经网络隐藏层应该使用的函数是ReLU。
其它激活函数
除了 sigmoid、tanh、ReLU 之外还有其他激活函数。例如Leaky ReLu、ELUReLU 的修改、Swish 等。其中许多有助于解决某些问题。您可以阅读其中一些内容 这里。
使用全连接神经网络解决 XOR 问题
现在让我们尝试使用完全连接的神经网络来解决 XOR 问题。让我们使用 ReLU 激活函数构建一个具有一个隐藏层和三个神经元的网络
from sklearn.neural_network import MLPClassifiermlp MLPClassifier(hidden_layer_sizes(3,), activationrelu, solversgd, max_iter5000, random_state42)
mlp.fit(X, y)输出
plt.figure(figsize(15,10))
plot_boundary(mlp, X, y,
XOR problem solution)输出
mlp.coefs_, mlp.intercepts_输出
神经网络用于回归问题
到目前为止我们一直在讨论二元词汇分类问题。我们根据对数回归建立了一个神经网络这是一个二元分类问题的模型。但是当然借助神经网络不仅可以解决这个问题还可以解决其他问题。
经典机器学习中众所周知的问题包括
回归问题多类分类问题
为了使完全连接的神经网络适应回归问题您只需将最后一层的逻辑回归替换为线性回归。也就是说从最后一层的神经元中去除激活函数。请注意激活函数必须保留在网络的所有隐藏层中
下一课我们将讨论多类分类的问题。
训练神经网络 训练神经网络包括为特定任务寻找网络参数的最优值。
这是什么意思假设我们有一个数据集。让我们以上面使用的 CVD 数据集为例。
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_{i1}^n L(y_i, \widehat{y}_i)}{n} \to min n∑i1nL(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图神经网络。这种类型的神经网络在处理具有图形性质的数据时效果很好。例如社交网络图/物质分子等。
附加材料
人工和生物神经元与神经网络的类比
在这里我们将尝试展示如何在人工和生物神经元与神经网络之间进行类比。
首先让我们概括地描述一下生物神经网络和大脑中单个神经元的结构。让我在这里澄清一下我对生物过程的描述并不声称是完整和严谨的我将在非常抽象、意识形态的层面上描述它们。
所以我们的大脑由数十亿个通过网络相互连接的神经元组成。神经元之间的连接称为突触信息通过它们传输。神经元彼此之间的连接相当混乱连接中没有特殊的结构。此外神经元之间会出现新的连接而旧的连接则会消失。
每个神经元从一组神经元接收信息并将其传输给另一组神经元。大脑中的信息以电脉冲的形式呈现因此当神经元接收和传输信息时电流就会通过它并“亮起来”。
此外神经元之间的突触具有不同的阻力。连接中的电阻大小决定了从一个神经元流向另一个神经元的电流量。如果阻力很大第一个神经元释放的冲动只有一小部分能够到达第二个神经元。如果电阻较低那么几乎整个脉冲都会顺利通过连接。因此电阻的大小可以被认为是信号的重要性来自第一个神经元的信号对于第二个神经元有多重要。
这就是大脑神经元之间信息传递过程的一般运作方式。 现在让我们更详细地讨论单个生物神经元的结构。一般来说一个神经元有三个组成部分树突、轴突和膜。
树突是神经元的输入神经元通过它接收来自大脑中其他神经元的信息。
在膜和细胞质中通过树突接收的信息被处理来自其他神经元的所有冲动被加起来并将总和与某个阈值进行比较。如果总和大于阈值则神经元被激活并且信息进一步传输到其他神经元。如果总和小于阈值则认为接收到的信息无关紧要神经元不会被激活也不会沿着网络进一步传输信息。也就是说冲动逐渐消失。
神经元的最后一个元素是轴突。轴突通过突触与其他神经元的树突相连。正是通过这条通路一个神经元中积累的信息被传输到下一个神经元。嗯如果发生了激活当然可以。
这大致就是生物神经元的结构。现在让我们根据人工神经元的结构建立一个模型。 圆圈是膜左边的边缘是突触来自其他神经元用灰色圆圈表示的信息通过突触进入细胞核。右侧的边缘是突触它将信息传递到网络中其他的神经元。 在计算机中所有信息都以数字表示。因此我们的人工神经元将以数字的形式接收和传输信息而不是像生物神经网络那样以电脉冲的形式。
人工神经元如何处理信息看我们的神经元与其他五个神经元相连它从三个神经元接收信息并将信息传递给两个神经元。让三个传入的神经元向我们的绿色神经元的输入发送大小为十、七和三的脉冲。神经元之间的每个边都有一个权重——某个实数。当来自神经元的信号沿着边缘传递时该信号会乘以边缘的权重。也就是说三个信号将到达我们的绿色神经元十乘以零五、七乘以一和三乘以零一。人工神经元中的边缘权重类似于生物神经网络中神经元之间连接的阻力。然后在核心内部这些信号被加在一起形成一个信号在我们的例子中它是十二点三。然后将该信号与阈值进行比较。让神经元中的阈值为十。
我们看到这种人工神经元模型类似于逻辑回归和我们在课堂上讨论的人工神经元。唯一的区别是激活函数。在人工中子网络中它不是一个阈值。
这就是人们如何将生物和人工神经元与神经网络进行类比。然而这种类比并不能解释为什么在人工神经网络中神经元被组合成层并且连接只存在于连续层的神经元之间。但在笔记本电脑的主要部分幸运的是我们已经弄清楚了为什么人工网络以这种方式构建。