神经网络理论(机器学习)

motivation

如果逻辑回归的特征有很多,会造出现一些列问题,比如:

  1. 线性假设的限制: 逻辑回归是基于线性假设的分类模型,即认为特征与输出之间的关系是线性的。如果特征非常多或者特征与输出之间的关系是非线性的,逻辑回归可能无法很好地进行分类。

  2. 特征间相关性: 如果特征之间高度相关,逻辑回归可能会受到多重共线性的影响,导致参数估计不稳定或难以解释。

  3. 非线性决策边界的需求: 在复杂的分类问题中,数据可能需要非线性的决策边界来更好地进行分类。

相比之下,神经网络有一系列的优势:

  1. 非线性关系建模: 神经网络能够学习复杂的非线性关系,因此在特征与输出之间存在非线性关系或需要复杂的决策边界时,神经网络通常能提供更好的性能。

  2. 自动特征学习: 神经网络能够通过隐藏层自动学习特征的高级表示,无需手动进行特征工程,这对于大量特征的问题尤为有利。

  3. 适应性强: 神经网络通常对数据中的噪声和复杂性具有一定的鲁棒性,能够更好地泛化到新的数据集。

简单人工神经网络

那么简单介绍一下神将网络:

上面是一个简单人工神经网络,x1-->x3是输入的特征,每个特征都会乘上相应的参数最后得到一个值。(这样看起来和线性回归差不多)

复杂神经网络(旧版本)

接下来介绍一个稍微复杂一点的:

首先定义一些术语:

|---------------------------------------------|-------------------------------|
| | 第i层,第j个神经元的激活项 |
| | 从j层到j+1层的权重矩阵(注意,行从1开始,列从0开始) |
| 激活项 | 由一个神经元接受并输出的值 |

注意:

其中g是激活函数。

这里可能不容易理解:

其实是一个矩阵:

上图其实还有一个隐藏的没有画出。就像第一个图一样,这个是用来调节参数的。

在上图中表示:第二层的第i个神经元接受第一层的第j个特征值,形成的参数(权重)。权重乘上相应的数值得到的值(这个神经元接受前面的所有的神经元传递给他的值的和)(如上是由前面x0,x1,x2,x3传递给第二层第一个神经元得到,再通过激活函数g映射得到数值。)

得到结论:

一个神经网络的第j层有个单元,第(j+1)层有个单元,那么从j到(j+1)层的权重矩阵属于。即形状为

复杂神经网络(新版本)

我们再来看一下另一种解释(其实本质差不多,只不过最新的术语有些改变)

|-----------------------------------------------|----------|
| | 第i层输入出向量 |
| | 这个神经元的权重 |
| | |

这里面x就是一个特征向量矩阵,叫做0层(layer0),与上面一个版本有所不同,上面一个版本吧输入的x叫做layer1。这里面,我们把每一个圆形叫做一个"神经元",每个神经元都有两个参数,分别是向量和参数b。这个向量的维度与其前一层神经元的个数有关,如果前一层神经元有n个那么这个向量就是n维,因为这样才可以出现下面图展示的:

这里可以简化为:

注意:每一层的g函数是一样的,不同层的g函数可以不一样。为了统一,我们经常把输入层(layer0)叫做

向前传播(预测)

接下来看一下如何前向传播(通俗点讲叫预测,注意不包含训练)

我们将预测图像显示的是1 or 0。

下面的一个图像是灰度像素展示,是一个1。

我们按照行,把每行首尾相连,组合成一个8*8=64维的向量,把它作为x(输入层,)。

然后我们搭建我们的神经网络:

计算过程:

向前传播在python中实现:

已知有上面的神经网络。

将这几个权重整合在一起:

python 复制代码
w = np.array([
    [1, -3, 5],
    [2, 4, -6]
])

注意,是两行三列,

python 复制代码
b = np.array([-1, 1, 2])
python 复制代码
a_in = np.array([-2, 4])

接下来要创建一个函数用来搭建每一层网络。

python 复制代码
def dense(a_in, W, b, g):
    units = W.shape[1]  # 计算这一层有多少个单元
    a_out = np.zeros(units)  # 初始化输出
    for i in range(units):
        w = W[:, i]  # 取出W的第j列,也就是第j个单元的w向量,注意这里取出的w是1D向量
        z = np.dot(w, a_in) + b[i]  # 这里的a_in也是1D向量
        a_out[i]=g(z)   #g为激活函数
    return a_out

虽然已经有了网络,但是如何将已经有的网络连接起来呢?

还要建立一个函数:

python 复制代码
def sequential(x):
    a1 = dense(x, W1, b1, g)
    a2 = dense(a1, W2, b2, g)
    a3 = dense(a2, W3, b3, g)
    a4 = dense(a3, W4, b4, g)
    f_x = a4
    return f_x

代码的高效实现

python 复制代码
W = np.array([
    [1, -3, 5],
    [2, 4, -6]
])              #不变
B = np.array([[-1, 1, 2]])   #变成二维
X = np.array([[-2, 4]])      #变成二维


def dense(A_in, W, B):
    Z = np.matmul(A_in, W) + B   #这个方法不支持标量
    A_out = g(Z)
    return A_out

训练网络

对于下面网络:

我们调用tensorflow库,实现下面代码:

python 复制代码
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
model = Sequential(
    [
        Dense(units=25,activation='sigmoid')
        Dense(units=15,activation='sigmoid')
        Dense(units=1,activation='sigmoid')
    ]
)
from tensorflow.keras.losses import BinaryCrossentropy
model.compile(loss=BinaryCrossentropy)
model.fit(X,Y,epochs=100)

注意,这里的tensorflow由于版本问题,可能不含keras,可以直接下载keras这个包。(自己搞了半天才研究出来,大哭)

注意上面的步骤:

  1. model = Sequential(..)
  2. model.compile(loss=...)
  3. model.fit(X,y,epochs=100)
相关推荐
Chef_Chen14 分钟前
从0开始学习机器学习--Day22--优化总结以及误差作业(上)
人工智能·学习·机器学习
Mr.简锋19 分钟前
opencv常用api
人工智能·opencv·计算机视觉
华清元宇宙实验中心23 分钟前
【每天学点AI】前向传播、损失函数、反向传播
深度学习·机器学习·ai人工智能
DevinLGT1 小时前
6Pin Type-C Pin脚定义:【图文讲解】
人工智能·单片机·嵌入式硬件
宋一诺331 小时前
机器学习—高级优化方法
人工智能·机器学习
龙的爹23331 小时前
论文 | The Capacity for Moral Self-Correction in LargeLanguage Models
人工智能·深度学习·机器学习·语言模型·自然语言处理·prompt
Mr.简锋1 小时前
opencv视频读写
人工智能·opencv·音视频
Baihai_IDP1 小时前
「混合专家模型」可视化指南:A Visual Guide to MoE
人工智能·llm·aigc
寰宇视讯2 小时前
“津彩嘉年,洽通天下” 2024中国天津投资贸易洽谈会火热启动 首届津彩生活嘉年华重磅来袭!
大数据·人工智能·生活
Light602 小时前
低代码牵手 AI 接口:开启智能化开发新征程
人工智能·python·深度学习·低代码·链表·线性回归