Advertisement

【Neural Networks and Convolutional Neural Networks by Jonathan Fernandes】

阅读量:

Jonathan Fernandes

Neural Networks and Convolutional Neural Networks

Artificial Neurons人工神经元,1957康奈尔大学 罗布拉特:“决定苍蝇是否应该逃跑的大部分机制都是在眼睛中的”。苍蝇的视网膜包含几个排列成矩阵的光传感器。传感器输出被连接到一组识别特定模式的处理元件。这些处理元件的输出进入阈值逻辑单元,然后根据针对这种入参类型激励(excited)或是触发(fires)。然后,这决定了苍蝇是逃跑还是留在原地。
在这里插入图片描述
bias
weights
以上感知器模型对于二分类问题----充分必要条件----就是说,超过某个阈值的输出将是1,否则为0。

Gradient Descent梯度下降算法

Input Data
输入数据x是神经网络的输入
可以是一个特征向量

Weights and Bias权重和偏置
每个输入数据与对应的权重 w 相乘再加上偏置 b
权重和偏置是模型的参数需要通过训练来优化
权重和偏置不是超参数它们是模型参数
权重和偏置会随着训练的进行而不断更新以最小化损失函数

Linear Combination线性组合
计算输入数据的线性组合 这是神经元的初步输出

Activation Function激活函数的输出 y pred 是模型的预测值
如 Sigmoid ReLU softmax等

Predicted Value预测值模型预测值是好多好多个激活函数

True Value真实值真实值 y true是训练数据中的标签

Loss Function损失函数 计算模型预测值 y pred与真实值 y true之间的差异
常见的 例子 如交叉熵损失

Backpropagation反向传播通过反向传播算法计算损失函数对每个参数的梯度(导数)
反向传播的核心是链式法则,它允许我们将复杂的梯度计算分解为简单的步骤。
通过逐层计算误差项,我们可以高效地得到每个参数的梯度。

Gradient Descent梯度下降根据梯度更新参数 w 和 b以最小化损失函数

Learning Rate学习率η是超参数
超参数是那些在模型训练之前需要人为设定的参数而权重和偏置是模型在训练过程中通过优化算法学习到的参数
步长(学习率决定了步长)控制参数更新的幅度,确保更新过程稳定且高效。

梯度下降算法的挑战:

因为:损失函数是不可微函数。
导致:再计算导数的时候,遇到“除以0”,这在数学上是无意义的。
在这里插入图片描述
解决的对策呢,就需要用一个我们最最最熟悉的逻辑回归,就是一旦出现刚才那种情况就要用这种函数去代替,然后长得很像吗?你看。
在这里插入图片描述
所以这个损失函数到底是个啥呢?如果我们对这个问题一无所知,我们可以使用另一种方式:因为我们使用逻辑函数,提供的是概率作为输出,所以我们可以使用一个更智能的损失函数称为交叉熵损失函数。
在这里插入图片描述

XOR挑战与解决方式

在这里插入图片描述

上节课提到我们用二分类问题,通常就是说大于0.5我们得到一个值,然后小于0.5得到另一个。然后你的输出就是两个类别,x1 x2,我们现在要去分开也是区分这两种类那个我们想要找一个线性的方式来区分的话就是找到了x1等于0.5的那条垂直线。然后我们的挑战是当图片看起来是四部分的时候怎么办?
研究人员很快,发现使用二元分类器(例如单个神经元)无论你怎么尝试,你都不能画一条直线,把蓝色与黑色分开,或者说没有可以应用的线性函数将蓝色与黑色分开。
这被称为异或问题,研究人员认为如果不能解决这样的简单问题,那么在人工智能研究上投入时间就没有价值。
XOR或Exclusive OR是一个布尔运算符,如and 、or,这些是计算机逻辑的基础。

The XOR challenge and solution

这是一个大问题,因为很明显,蓝色和黑色很容易区分开,这被称为异或问题,研究人员认为,如果不能解决这样简单的问题,那么在人工智能研究上投入时间就没有价值。这是1970年至1985年人工智能研究的寒冷和黑暗冬天对的原因。什么是异或函数,为什么它很重要?XOR或Exclusive OR是一个布尔运算符,如and和or,这些事计算机逻辑的基础。有了XOR,您可以在不使用临时变量的情况下执行奇偶校验和交换

What Do We Need to Change? (3)

-很明显我们需要在我们的系统计算中引入一些非线性函数。 怎么引入非线性函数?引入非线性的激活函数
-那么问题来了,我们如何从单个神经元延伸出来形成 一个神经网络?我们可以连接一个神经元的输出,这样他就是另一个神经元的输入
-此外,如果我们可以在神经网络中引入一些非线性函数,那么我们将能够在不使用直线的情况下区分输出。

Neural Networks

再上一个视频中,我们看到了使用单个感知器的一些局限性,因为输出只是输入的线性组合,以及我们需要如何将非线性引入我们的网络。
关键问题之一是我们如何从单个神经元扩展到神经网络。我们将定义一个多层感知器,即 感知器被分成多层的感知器。一个感知器的输出将是另一个二感知器的输入。您将看到这是一个完全连结的层,因此每个层处理前一层的所有输出
在这里插入图片描述
输入是权重乘以输入乘积之和的线性组合。这个感知器的输入是所有输出乘以前一层感知器的权重wij的线性组合,该感知器的输出连接到下一层中的所有感知器。
我们通过确保我们使用的激活函数(确定神经元是否触发的函数)是非线性的,从而确保引入非线性这个思想得以实现。

因此,我们有一个输入层和一个输出层,如果两者之间有任何层,这称为隐藏层。在这里,我们只有一个隐藏层,但实际上可能有多个隐藏层。深度神经网络是具有一个或多个隐藏层的神经网络。

AdditionL Properties of Neural Networks

给定网络的输入集和输出,有多少隐藏层才足以学习任何函数?
在1989年,Cybenko引入了一个定理,表明一个隐藏层就足够了。

Cybenko’s Theorem

该定理的影响相当深远,这意味着只有一个隐藏层的神经网络可以预测输出或输出的近似值,不管输出多么复杂。Cybenko定理指出,你只需要一个隐藏层就能创建一个近似的估计模型,你会发现许多流行的神经网络都有10、20、50和更多的隐藏层,因为这些模型可以提供更准确的结果。

Why the Hype?

所以,你可能想知道,为什么现在对神经网络大肆宣传。🍎
在这里插入图片描述

很多事情都发生在很久以前:
电子大脑在1940年代也有权重的概念,但这些权重无法被学习。
接下来是罗森布拉特在1957年创造了感知器。
感知器和ADALINE都是二元分类器,并使用线性决策。
反向传播发明于1986年。
那么为什么深度学习在过去几年中以如此显著的方式开始呢?答案是双重的。
①首先,大量标记图像数据的可用性。例如如果我要查找我最喜欢的运动,壁球squash,能找到有成千上万的图像,被标记为壁球。
②其次,GPU的大规模计算能力,以及NVIDIA等供应商

如何使用激活函数将非线性引入神经网络

激活函数的候选者: Step Function,输出是0或1;如果class 有很多,那就输出0、1、2、3、4、5、6、7、8、9…

Linear Function,我们不想用linear function因为它会导致XOR问题,🍎(No matter how many layers——if all of them are linear, the final activation of last layer is linear这句话是老师教案中的,这句话揭示了我们终会有一个最终层的激活函数,它将汇总前面所有层、所有神经元的激活函数)此外,你也可以理解这句话,就是说,具有线性激活函数的多个层可以用单个线性函数代替。

Sigmoid Function 使用sigmoid函数时,输出介于0和1之间。这意味着它适用于二元分类,因为输出是接近1或0,真或假。 Sigmoid函数的缺点就是梯度消失,这会导致在边界附近,网络学习不会很快。

Tanh或双曲正切是另一种可能的非线性函数,Sigmoid 的输出介于0和1之间,tanh是根据指数定义的,输出介于-1和+1之间。由于输出不是1和0,也不是真和假,因此它不像sigmoid那样适合二元分类问题。此外,tanh函数可以由sigmoid组成,这意味着sigmoid存在梯度消失的问题,tanh也会有。

ReLU(读作“rai留”)或(Rectified Linear Unit)整流线性单元定义位小于0的任何x值输出0。 例如,如果您的输入x=-2,则ReLU将返回0 如果您输入x=+2,则ReLU将返回+2 乍一看,您可能会认为ReLU与线性函数具有相同的问题。但是,ReLU是非线性的,Relu的组合是非线性的。 看得出来,他的计算成本将低于sigmoid函数,ReLU是比較知名的激活函數之一。

那麽,您如何知道要使用哪一個呢? 您需要進行實驗,看看哪一個爲您的特定模型提供最佳性能。(這跟沒說差不多) 但總的來説,您會發現ReLU在許多情況下提供了良好的性能,并且是一個很好的起點。

反向傳播和超參數

反向傳播(Backpropagation)由Hinton,Rumelhart和Williams于1985年引入。
我們有網絡的輸入,我們的神經網絡提供了一些輸出。然後我們要將其與預期輸出或實際輸出進行比較。
我们计算损失函数并取损失函数的梯度。
然后我们可以直接计算输出神经元的权重。
名称中的back是因为梯度的计算在整个网络中向后进行,首先计算最后一层权重的梯度,最后计算第一层权重的梯度。

超参数

在机器学习中,超参数(Hyperparameters)是在学习过程开始之前设置其值的参数。
必须要考虑:
-我们需要指定几个超参数?
-我们想为神经元使用什么激活函数?
-我们想使用什么学习率(learning rate)
-每层我们需要多少个神经元
-我们需要多少隐藏层?

Visualiztion

这是我们在继续之前,巩固理解的好机会。 因此,让我们转到我们的浏览器并输入playground.tensorflow.org 我们将使用左下角的数据集开始,我们有两个特征或输入X1和X2,以及Epoch,作为通过数据集的完整历程遍数。 梯度下降可以调整的元素太多了:不论是move in的方向还是步长。 我i们可以通过调整学习率来调整步长。让我们把步长调整到0.3。 激活函数决定了神经元是否触发。 在这里默认的激活函数是双曲正切Tanh。 正则化Regularization L1 和 L2是起到的作用是减少过拟合,过拟合是对训练数据工作良好但是对没见过的数据集就不能很好预测。 最后,我们要解决的问题类型是分类而不是回归。

我们要使用四个数据集中左下角的线性可分数据集) 我们从创建一个Percept tron(感知器)开始 我们没有隐藏层的激活函数是线`的。 -----现在 ------ 我们可以看到我们的模型能够很快的区分两种类型的X1和X2。

接下来,让我们演示一下XOR问题, 然我们选择右上角的数据集,然后单击,您可以看到我们的模型无法区分这两个类 然后我们增加1个隐藏层,然后再隐藏层增加到4个神经元。-----如果我们再次------ 我们可以看到这依然不起作用,因为我们的激活函数是线性的。

因此,我们需要做的是在这里引入一些非线性,因此让我们将激活函数更改为非线性ReLU。 -----如果我们再次------ 您可以很快看到,我们的模型能够区分输出类。

让我们选择左上角的“圆圈”数据集, 所以我们在圆圈的中心有蓝色,再圆圈的外面有橙色。 正因为我们可以,让我们添加另一个带有四个神经元的隐藏层。 使用Sigmoid函数作为我们的激活函数, 看到,在Epoch几百次之后,我们能够区分这两个类。

–但是-- 如果我们现在将激活函数更改为ReLU而不是Sigmoid,,我们可以看到在不到一百个Epoch就能区分这两个类。 这样你就理解为什么ReLU如此受欢迎了

Keras 介绍

Keras 是一个高级神经网络的API,用Python 编写,能够在TensorFlow,CNTK或Theano上。
Nvidia(cuda)-> TensorFlow CNTK Theano(backend)-> Keras(python)
让我们来看看Keras的一些组件,从编译``Compile开始。在训练模型之前,您需要配置学习过程,这是通过编译方法完成的。它接受三个参数,
优化器``Optimizer,这是通过给定一组参数返回一个具有较小损失函数的算法,损失是用于测量神经网络性能误差准确性的目标。
损失(函数)``loss
指标``metrics:指标的list。对于任何分类问题,您都需要将此指标设置为准确的

优化器

-因此,让我们看一下第一个参数,即优化器。您可以:用默认参数值按照名称调用它,也可以再将优化器传递给模型或编译函数之前实例化优化器。在我们的示例中,我们将首先用名臣该调用他们来实例化他们。
①SGD =(随机梯度下降优化器Stochastic gradient descent optimizer)
包含对他们的支持:动量、学习率衰减、Nesterov动量。
②RMSprop 是递归神经网络的不错选择
③Adam 一种基于一阶梯度的随机目标函数优化算法(An algorithm for first-order gradient-based optimization of stochastic objective functions)。
在我们的示例中,我们将使用Adam 作为我们选择的优化器。

为什么是一阶

“一阶”是一个数学概念,它在优化算法中表示算法仅使用梯度(一阶导数)信息来进行优化。以下是对“一阶”的理解:

  • 基础概念 :在数学中,“一阶”通常与导数的阶数相关。对于一个函数,其一阶导数反映了函数在某一点的斜率或变化率,而二阶导数则描述了一阶导数的变化率。在优化算法中,一阶算法指的是那些仅依赖于目标函数的一阶导数(梯度)来进行参数更新的算法。
  • 与二阶算法对比 :二阶优化算法会利用目标函数的二阶导数(海森矩阵)信息。二阶导数提供了函数曲率的信息,可以帮助算法更好地理解目标函数的形状,从而可能更快地收敛。然而,计算二阶导数及其逆矩阵在高维问题中计算成本很高,因此二阶算法在大规模机器学习问题中应用较少。相比之下,一阶算法由于只需要计算梯度,计算效率更高,适合处理大规模数据和复杂模型。
  • 应用场景 :Adam算法作为一种一阶优化算法,在训练深度学习模型等场景中被广泛应用。深度学习模型通常具有大量的参数,在这些高维参数空间中,计算二阶导数是不现实的。而一阶算法通过利用梯度信息,能够在合理的计算成本内有效地优化模型参数,使模型逐渐逼近最优解。
    -
    -

现在,让我们来看看一些常见的损失函数。
-Mean_squared_error: regression problem
Mean squared error computes the element-wise square defense between the two tensors.均方误差计算两个张量之间的元素级平方差。

什么是张量?

在机器学习和神经网络中,张量是用于表示数据的基本结构,可以理解为多维数组。
例如:

  • 0维张量 :一个单独的数,比如 5
  • 1维张量 :一个向量(一维数组),比如 [1, 2, 3]
  • 2维张量 :一个矩阵(二维数组),比如:
复制代码
    [[1, 2, 3],

     [4, 5, 6]]
    
    
    python
    
    
  • 3维张量 :一个三维数组,比如:
复制代码
    [[[1, 2, 3],

      [4, 5, 6]],
     [[7, 8, 9],
      [10, 11, 12]]]
    
    
    python
    
    

均方误差(Mean Squared Error, MSE)的计算

均方误差是衡量预测值和实际值之间差异的一个常用指标。它的公式是:

MSE=1n∑i=1n(ytrue,i−ypred,i)2 MSE = \frac{1}{n} \sum_{i=1}^{n} \left( y_{\text{true},i} - y_{\text{pred},i} \right)^2

ytrue,i=第 i 个样本的实际值(真实值)ypred,i=第 i 个样本的预测值n=样本的总数量

示例

假设我们有一个简单的回归问题,我们有以下实际值和预测值:

ytrue=[2,4,6,8]ypred=[3,3,7,9]
这些值可以表示为1维张量。

计算步骤:
  1. 计算每个元素的差值

ytrue,i−ypred,i=[2−3,4−3,6−7,8−9]=[−1,1,−1,−1] y_{\text{true},i} - y_{\text{pred},i} = [2 - 3, 4 - 3, 6 - 7, 8 - 9] = [-1, 1, -1, -1]

计算每个差值的平方
(−1)2,(1)2,(−1)2,(−1)2=[1,1,1,1] (-1)^2, (1)^2, (-1)^2, (-1)^2 = [1, 1, 1, 1]

计算平方差的平均值
MSE=14×(1+1+1+1)=44=1 MSE = \frac{1}{4} \times (1 + 1 + 1 + 1) = \frac{4}{4} = 1

用Python和NumPy实现

以下是如何使用Python和NumPy来计算均方误差的代码示例:

复制代码
    import numpy as np
    
    # 实际值和预测值
    y_true = np.array([2, 4, 6, 8])  # 实际值张量
    y_pred = np.array([3, 3, 7, 9])  # 预测值张量
    
    # 计算均方误差
    mse = np.mean((y_true - y_pred) ** 2)
    
    print("均方误差 (MSE):", mse)
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/0siOfw7xNmuMaYhUKvlgX6STHdF2.png)
输出:
复制代码
    均方误差 (MSE): 1.0
    
    

解释

  • 张量的表示y_truey_pred 都是1维张量(向量)。
  • 元素级操作y_true - y_pred 是两个张量的元素级减法。
  • 平方操作(y_true - y_pred) ** 2 是对每个元素求平方。
  • 均值np.mean 计算所有元素的平均值。

这个例子展示了如何在机器学习中使用张量来表示数据,并通过张量操作计算损失函数(如均方误差)。
-Categorical_crossentropy: when your target has multiple classes.计算预测和目标之间的分类交叉熵,这通常在目标具有多个类时使用。

以下是将所有内容使用$$开头和结尾的公式写法:

变量解释

ytrue,i=第 i 个样本的实际值(真实值)ypred,i=第 i 个样本的预测值n=样本的总数量

示例计算

假设我们有以下实际值和预测值:

ytrue=[2,4,6,8]ypred=[3,3,7,9]

计算步骤如下:

  1. 计算每个元素的差值

ytrue,i−ypred,i=[2−3,4−3,6−7,8−9]=[−1,1,−1,−1] y_{\text{true},i} - y_{\text{pred},i} = [2 - 3, 4 - 3, 6 - 7, 8 - 9] = [-1, 1, -1, -1]

  1. 计算每个差值的平方

(−1)2,(1)2,(−1)2,(−1)2=[1,1,1,1] (-1)^2, (1)^2, (-1)^2, (-1)^2 = [1, 1, 1, 1]

  1. 计算平方差的平均值

MSE=14×(1+1+1+1)=44=1 MSE = \frac{1}{4} \times (1 + 1 + 1 + 1) = \frac{4}{4} = 1

损失函数

现在,让我们来看看一些常见的损失函数。
-Mean_squared_error: regression problem
Mean squared error computes the element-wise square defense between the two tensors.均方误差计算两个张量之间的元素级平方差。
-Categorical_crossentropy: when your target has multiple classes.计算预测和目标之间的分类交叉熵,这通常在目标具有多个类时使用。
-binary_crossentropy:when your target has two classes.

metrics

请记住,metrics 是用来判断模型性能的函数。
对于任何分类问题,您都需要使用metrics作为准确性。

全部评论 (0)

还没有任何评论哟~