人工智能原理自学(二)——笔记目录
激活函数——给机器注入灵魂
人类思考问题的方式,往往都是离散的分类,而不是精确的拟合
基于分类的思想,传统的量值函数模型已经无法描述基于分类思想而得到的阶跃式函数值:

激活函数
面对两极分化的分类问题,在一元一次函数的输出大于某个阈值的时候输出1,小于某个阈值时输出0,可以用一个数学函数来描述这一分类,通常称这个函数为 激活函数。很容易想到的激活函数其实就是分段函数了,但是从梯度下降的视角来看,分段函数在分段点处存在一个**“冲击导数”**,不便于梯度下降时求导的进行。
因此采用一种“S型” 函数——Logistic函数

Logistics函数我们一般也是使用它的标准形式,也就是取L = 1,k = 1,y0 = 0.这属于Logistics函数的一种特例。此时要注意:
Sigmoid函数在数学意义上指的是一切具有S形状的函数,Logistics函数属于其中的一种,也是最为常用的一种。除此之外还有比如双正切函数Tanh,反正切函数arctan等。不过在人工智能领域鉴于大家默认使用的都是标准的Logistics函数,慢慢的人们也就不再区分这两种叫法。我们在机器学习中说Sigmoid函数,一般也就是指的标准Logistics函数

因此,将前文的函数模型y = wx +b变化为a = Sigmoid(wx + b)最终输出,就有了类似的分类拟合效果。则此时的代价函数为:
error = (y - Sigmoid(wx + b))^2
根据复合函数的链式求导法则,就可以求出关于w,b的导数表达式。
综上,非线性的激活函数Sigmoid的加入,使得原本线性的Rosenballt神经元模型变为了一个非线性模型,可以描述更多内容
代码实现:
import dataset
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
xs,ys = dataset.get_beans(100)
w = 0.100
b = 0.1
z = w * xs + b
a = 1/(1 + np.exp(-z))
# plot the figure
plt.title ("Size-Toxicity Function",fontsize = 12)
plt.xlabel("Bean size")
plt.ylabel("Toxicity")
plt.scatter(xs,ys)
plt.plot(xs ,a)
plt.show()
for _ in range(50000):
for i in range(100):
x = xs[i]
y = ys[i]
z = w * x + b
a = 1/(1+np.exp(-z))
e = (y - a)**2
deda = -2 * (y - a)
dadz = a * (1-a)
dzdw = x
dedw = deda* dadz * dzdw
dzdb = 1
dedb = deda * dadz * dzdb
alpha = 0.05
w = w - alpha * dedw
b = b - alpha * dedb
if _%100 == 0:
plt.clf()
plt.scatter(xs,ys)
z = w * xs + b
a = 1/(1 + np.exp(-z))
plt.xlim(0,1)
plt.ylim(0,1.2)
plt.plot(xs,a)
plt.pause(0.01)
print(b)
print(w)
隐藏层:神经网络为什么Working

问题的引出:
通过上文激活函数的概念,我已经可以通过Sigmoid函数的调节作用来对样本进行“一维”的简单描述,但是正如上图所示的样本分布特征,仅使用“一维”的神经网络来进行描述已经不足以表征样本信息,为我们需要再增加几个神经元用来进行更多信息的解读,这些中间层神经元就称为“隐藏层”,一般可以把隐藏层超过三层的神经网络称为**“深度神经网络”**
每添加一个神经元,就相当于添加了一个抽象的“维度”,把输入放入不同的维度中,每个维度通过不断的调整权重并进行激活,从而可以产生对输入的不同理解,最后再把这些抽象维度中的输出合并降维。

模型的“泛化”问题,就是神经网络追求的核心问题
代码实现:
基于梯度下降的求导思路:

from inspect import formatannotationrelativeto
import dataset
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
# Person function def
def Sigmoid(x):
return 1/(1 + np.exp(-x))
def forward_propgation(xs):
# 前向传播
#第一层
z1_1 = w11_1 * xs + b1_1
a1_1 = Sigmoid(z1_1)
z2_1 = w12_1 * xs + b2_1
a2_1 = Sigmoid(z2_1)
# 第二层
z1_2 = w11_2 * a1_1 + w21_2 * a2_1

本文介绍了激活函数在机器学习中的重要性,特别是Sigmoid函数如何赋予神经网络非线性能力,使其能处理更复杂的分类问题。通过示例展示了隐藏层的引入如何增强模型的表达能力,通过不断迭代优化权重,逐步提高模型的预测准确性。此外,还探讨了高维空间中的问题处理,以及隐藏层神经元如何扭曲类型分割线以适应更多维度的数据。
最低0.47元/天 解锁文章
388





