神经网络基础(二)

简介: 神经网络基础(二)

1.2.3 导数



理解梯度下降的过程之后,我们通过例子来说明梯度下降在计算导数意义或者说这个导数的意义。


1.2.3.1 导数


导数也可以理解成某一点处的斜率。斜率这个词更直观一些。


各点处的导数值一样


image.png


我们看到这里有一条直线,这条直线的斜率为4。我们来计算一个例子


例:取一点为a=2,那么y的值为8,我们稍微增加a的值为a=2.001,那么y的值为8.004,也就是当a增加了0.001,随后y增加了0.004,即4倍


那么我们的这个斜率可以理解为当一个点偏移一个不可估量的小的值,所增加的为4倍。


可以记做\frac{f(a)}{da}daf(a)或者\frac{d}{da}f(a)dadf(a)


各点的导数值不全一致


image.png


例:取一点为a=2,那么y的值为4,我们稍微增加a的值为a=2.001,那么y的值约等于4.004(4.004001),也就是当a增加了0.001,随后y增加了4倍


取一点为a=5,那么y的值为25,我们稍微增加a的值为a=5.001,那么y的值约等于25.01(25.010001),也就是当a增加了0.001,随后y增加了10倍


可以得出该函数的导数2为2a。


  • 更多函数的导数结果


image.png


1.2.3.2 导数计算图


那么接下来我们来看看含有多个变量的到导数流程图,假设J(a,b,c) = 3{(a + bc)}J(a,b,c)=3(a+bc)


我们以下面的流程图代替


image.png


这样就相当于从左到右计算出结果,然后从后往前计算出导数


导数计算


问题:那么现在我们要计算J相对于三个变量a,b,c的导数?


假设b=4,c=2,a=7,u=8,v=15,j=45


  • \frac{dJ}{dv}=3dvdJ=3


增加v从15到15.001,那么J\approx45.003J≈45.003


  • \frac{dJ}{da}=3dadJ=3


增加a从7到7.001,那么v=\approx15.001v=≈15.001,J\approx45.003J≈45.003


这里也涉及到链式法则


1.2.3.3 链式法则


\frac{dJ}{da}=\frac{dJ}{dv}\frac{dv}{da}=3*1=3dadJ=dvdJdadv=3∗1=3

J相对于a增加的量可以理解为J相对于v*v相对于a增加的


接下来计算


  • \frac{dJ}{db}=6=\frac{dJ}{du}\frac{du}{db}=3*2dbdJ=6=dudJdbdu=3∗2


  • \frac{dJ}{dc}=9=\frac{dJ}{du}\frac{du}{dc}=3*3dcdJ=9=dudJdcdu=3∗3


1.2.3.4 逻辑回归的梯度下降


逻辑回归的梯度下降过程计算图,首先从前往后的计算图得出如下


  • z = w^Tx + bz=wTx+b


  • \hat{y} =a= \sigma(z)y^=a=σ(z)


  • L(\hat{y},y) = -(y\log{a})-(1-y)\log(1-a)L(y^,y)=−(yloga)−(1−y)log(1−a)


那么计算图从前向过程为,假设样本有两个特征


image.png



问题:计算出JJ 关于zz的导数


dz = \frac{dJ}{da}\frac{da}{dz} = a-ydz=dadJdzda=a−y
  \frac{dJ}{da} = -\frac{y}{a} + \frac{1-y}{1-a}dadJ=−ay+1−a1−y
  \frac{da}{dz} = a(1-a)dzda=a(1−a)


所以我们这样可以求出总损失相对于w_1,w_2,bw1,w2,b参数的某一点导数,从而可以更新参数


\frac{dJ}{dw_1} = \frac{dJ}{dz}\frac{dz}{dw_1}=dz*x1dw1dJ=dzdJdw1dz=dz∗x1
  \frac{dJ}{dw_2} = \frac{dJ}{dz}\frac{dz}{dw_1}=dz*x2dw2dJ=dzdJdw1dz=dz∗x2
  \frac{dJ}{db}=dzdbdJ=dz


相信上面的导数计算应该都能理解了,所以当我们计算损失函数的某个点相对于w_1,w_2,bw1,w2,b的导数之后,就可以更新这次优化后的结果。


w_1 := w_1 - \alpha\frac{dJ(w_1, b)}{dw_1}w1:=w1−αdw1dJ(w1,b)
w_2 := w_2 - \alpha\frac{dJ(w_2, b)}{dw_2}w2:=w2−αdw2dJ(w2,b)
b := b - \alpha\frac{dJ(w, b)}{db}b:=b−αdbdJ(w,b)


1.2.4 向量化编程



每更新一次梯度时候,在训练期间我们会拥有m个样本,那么这样每个样本提供进去都可以做一个梯度下降计算。所以我们要去做在所有样本上的计算结果、梯度等操作


J(w,b) = \frac{1}{m}\sum_{i=1}^mL({a}^{(i)},y^{(i)})J(w,b)=m1∑i=1mL(a(i),y(i))


计算参数的梯度为:d(w_1)^{i}, d(w_2)^{i},d(b)^{i}d(w1)i,d(w2)i,d(b)i,这样,我们想要得到最终的d{w_1},d{w_2},d{b}dw1,dw2,db,如何去设计一个算法计算?伪代码实现:


初始化,假设


{J} = 0, dw_1=0, dw_2=0, db={0}J=0,dw1=0,dw2=0,db=0
forfor i inin m:
 z^i = w^Tx^i+{b}zi=wTxi+b
 a^i = \sigma(z^i)ai=σ(zi)
 J +=-[y^ilog(a^i)+(1-y^i)log(1-a^i)]J+=−[yilog(ai)+(1−yi)log(1−ai)]


每个梯度计算结果相加


dz^i = a^i-y^{i}dzi=ai−yi
 dw_1 += x_1^idz^idw1+=x1idzi
 dw_2 +=x_2^idz^idw2+=x2idzi
 db+=dz^idb+=dzi


最后求出平均梯度


J /=mJ/=m
dw_1 /= mdw1/=m
dw_2 /= mdw2/=m
db /= mdb/=m


1.2.4.1 向量化优势



什么是向量化


由于在进行计算的时候,最好不要使用for循环去进行计算,因为有Numpy可以进行更加快速的向量化计算。


在公式z = w^Tx+bz=wTx+b中w,xw,x 都可能是多个值,也就是\bar w = \left(


w1⋮wn
w1⋮wn
\right), \bar x= \left(
x1⋮xn
x1⋮xn
\right)w¯=⎝⎛w1⋮wn⎠⎞,x¯=⎝⎛x1⋮xn⎠⎞


import numpy as np
import time
a = np.random.rand(100000)
b = np.random.rand(100000)


第一种方法


# 第一种for 循环
c = 0
start = time.time()
for i in range(100000):
    c += a[i]*b[i]
end = time.time()
print("计算所用时间%s " % str(1000*(end-start)) + "ms")


第二种向量化方式使用np.dot


# 向量化运算
start = time.time()
c = np.dot(a, b)
end = time.time()
print("计算所用时间%s " % str(1000*(end-start)) + "ms")
Numpy能够充分的利用并行化,Numpy当中提供了很多函数使用


image.png


所以上述的m个样本的梯度更新过程,就是去除掉for循环。原本这样的计算


1.2.4.2 向量化实现伪代码



  • 思路


image.png


可以变成这样的计算


\bar w = \left(
w1⋮wn
w1⋮wn
\right)w¯=⎝⎛w1⋮wn⎠⎞, \bar{x} = \left(
⋮x1⋮⋮x2⋮⋮x3⋮⋮⋮⋮⋮xm⋮
⋮⋮⋮⋮⋮x1x2x3⋮xm⋮⋮⋮⋮⋮
\right)x¯=⎝⎛⋮x1⋮⋮x2⋮⋮x3⋮⋮⋮⋮⋮xm⋮⎠⎞


注:w的形状为(n,1), x的形状为(n, m),其中n为特征数量,m为样本数量


我们可以让Z= {W^T}X + b=\left(z^1, z^2,z^3\cdots z^m \right)+b=np.dot(W^T,X)+bZ=WTX+b=(z1,z2,z3⋯zm)+b=np.dot(WT,X)+b,得出的结果为(1, m)大小的矩阵 注:大写的W,XW,X为多个样本表示


  • 实现多个样本向量化计算的伪代码


初始化,假设n个特征,m个样本


J = 0, W=np.zeros([n,1]), b={0}J=0,W=np.zeros([n,1]),b=0
Z= np.dot(W^T,X)+{b}Z=np.dot(WT,X)+b
A = \sigma(Z)A=σ(Z)


每个样本梯度计算过程为:


dZ = {A}-{Y}dZ=A−Y
dW = \frac{1}{m}X{dZ}^{T}dW=m1XdZT
db=\frac{1}{m}np.sum(dZ)db=m1np.sum(dZ)


更新


W := W - \alpha{dW}W:=W−αdW
b := b - \alpha{db}b:=b−αdb


这相当于一次使用了M个样本的所有特征值与目标值,那我们知道如果想多次迭代,使得这M个样本重复若干次计算


1.2.5 正向传播与反向传播



前面我们所做的整个过程分为两个部分,一个是从前往后的计算出梯度与损失,另外一部分是从后往前计算参数的更新梯度值。所以在神经网络当中会经常出现两个概念,正向传播与反向传播。


目录
相关文章
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
神经网络技术
【10月更文挑战第14天】神经网络技术
|
1月前
|
机器学习/深度学习
深度学习笔记(一): 神经网络之感知机详解
深度学习笔记(一):探索感知机模型及其在神经网络中的应用。
34 0
深度学习笔记(一): 神经网络之感知机详解
|
1月前
|
机器学习/深度学习 算法
深度学习笔记(四):神经网络之链式法则详解
这篇文章详细解释了链式法则在神经网络优化中的作用,说明了如何通过引入中间变量简化复杂函数的微分计算,并通过实例展示了链式法则在反向传播算法中的应用。
52 0
深度学习笔记(四):神经网络之链式法则详解
|
4月前
|
机器学习/深度学习 PyTorch 算法框架/工具
图神经网络是一类用于处理图结构数据的神经网络。与传统的深度学习模型(如卷积神经网络CNN和循环神经网络RNN)不同,
图神经网络是一类用于处理图结构数据的神经网络。与传统的深度学习模型(如卷积神经网络CNN和循环神经网络RNN)不同,
|
3月前
|
机器学习/深度学习 人工智能 算法
人人都能搞定的大模型原理 - 神经网络
从1950年人工智能初现雏形至今,感知机作为神经网络的基石,引领了从单层到深层神经网络的技术飞跃。20世纪50年代末,弗兰克·罗森布拉特受人脑神经元启发,提出了感知机模型,它能够通过学习调整权重与阈值来识别模式,如手写数字。随着技术进步,感知机演变成更为复杂的层级和卷积神经网络。直至2022年ChatGPT的问世,人工智能的应用进入了公众视野。感知机的学习机制基于监督学习,通过不断调整权重和阈值来提高识别准确性。这种“亚符号”派的技术逐渐发展为拥有数十亿参数的大模型,展示了强大的智能涌现能力。随着AI技术的不断发展,我们正步入一个人机共生的新时代。
|
5月前
|
机器学习/深度学习 存储 算法
简单的神经网络
softmax激活函数将多个未归一化的值转换为概率分布,常用于多分类问题。交叉熵损失函数,特别是与softmax结合时,是评估分类模型性能的关键,尤其适用于多分类任务。它衡量模型预测概率与实际标签之间的差异。在PyTorch中,`nn.CrossEntropyLoss`函数结合了LogSoftmax和负对数似然损失,用于计算损失并进行反向传播。通过`loss.backward()`,模型参数的梯度被计算出来,然后用优化器如`SGD`更新这些参数以减小损失。
|
5月前
|
机器学习/深度学习 算法 语音技术
神经网络
【6月更文挑战第14天】神经网络。
49 3
|
机器学习/深度学习 算法 自动驾驶
神经网络5
4.训练 下面简单介绍一下两层神经网络的训练。 在Rosenblat提出的感知器模型中,模型中的参数可以被训练,但是使用的方法较为简单,并没有使用目前机器学习中通用的方法,这导致其扩展性与适用性非常有限。从两层神经网络开始,神经网络的研究人员开始使用机器学习相关的技术进行神经网络的训练。例如用大量的数据(1000-10000左右),使用算法进行优化等等,从而使得模型训练可以获得性能与数据利用上的双重优势。 机器学习模型训练的目的,就是使得参数尽可能的与真实的模型逼近。具体做法是这样的。首先给所有参数赋上随机值。我们使用这些随机生成的参数值,来预测训练数据中的样本。样本的预测目标为yp,真实目标
84 0
|
机器学习/深度学习 存储 算法
神经网络基础
神经网络基础
下一篇
无影云桌面