《深度学习入门》读书笔记2:神经网络

关于感知机,既有好消息,也有坏消息。好消息是,即便对于复杂的函数,感知机也隐含着能够表示它的可能性。上一章已经介绍过,即便是计算机进行的复杂处理,感知机(理论上)也可以将其表示出来。坏消息是,设定权重的工作,即确定合适的、能符合预期的输入与输出的权重,现在还是由人工进行的。

神经网络的出现就是为了解决刚才的坏消息。具体地讲,神经网络的一个重要性质是它可以自动地从数据中学习到合适的权重参数。
在这里插入图片描述
用图来表示神经网络的话。我们把最左边的一列称为输入层,最右边的一列称为输出层,中间的一列称为中间层。中间层有时也称为隐藏层。“隐藏”一词的意思是,隐藏层的神经元(和输入层、输出层不同)肉眼看不见,这是上次两个输入一个输出的单层感知机

y = { 0 b + w 1 x 1 + w 2 x 2 0 1 b + w 1 x 1 + w 2 x 2 > 0 y=\begin{cases} 0 \quad b+w_1x_1+w_2x_2 \leq 0 \\ 1 \quad b+w_1x_1+w_2x_2 >0 \end{cases}
改写成更加简洁的形式,我们用一个h函数来表示这种分情况的动作(超过0则输出1,否则输出0)
y = h ( b + w 1 x 1 + w 2 x 2 ) y=h(b+w_1x_1+w_2x_2)

激活函数

刚才登场的h(x)函数会将输入信号的总和转换为输出信号,这种函数
一般称为激活函数(activation function)。如“激活”一词所示,激活函数的作用在于决定如何来激活输入信号的总和

在这里插入图片描述
神经元用一个○表示,左图是一般的神经元的图,右图是在神经元内部明确显示激活函数的计算过程的图(a表示输入信号的总和,h()表示激活函数,y表示输出

import numpy as np
import matplotlib.pylab as plt
def step_function(x):
 return np.array(x > 0, dtype=np.int)
def sigmoid(x):
 return 1 / (1 + np.exp(-x))
def relu(x):
 return np.maximum(0, x)
x = np.arange(-5.0, 5.0, 0.1)
y1 = step_function(x)
y2 = sigmoid(x)
y3 = relu(x)
plt.ylim(-0.1, 2) # 指定y轴的范围
plt.plot(x, y1,x,y2,x,y3)
plt.show()

在这里插入图片描述

  1. 首先注意到的是“平滑性”的不同。sigmoid函数是一条平滑的曲线,输出随着输入发生连续性的变化。而阶跃函数以0为界,输出发生急剧性的变化。sigmoid函数的平滑性对神经网络的学习具有重要意义
  2. 另一个不同点是,相对于阶跃函数只能返回0或1,sigmoid函数可以返回0.731 …、0.880 …等实数(这一点和刚才的平滑性有关)。也就是说,感知机中神经元之间流动的是0或1的二元信号,而神经网络中流动的是连续的实数值信号

神经网络

在这里插入图片描述
每一层数据的传递,利用线性代数的知识(这里推荐一本《线性代数和应用》),可以用用下公式表示
X ( i + 1 ) = X ( i ) W ( i ) + B ( i ) X^{(i+1)}=X^{(i)}W^{(i)}+B^{(i)}
X ( i ) X^{(i)} 第i层的输入, W ( i ) W^{(i)} 第i层的权重, B ( i ) B^{(i)} 第i层的bias

输出层的设计

我们处理监督学习(数据使用的是有“正确”答案)分为回归和分类问题(回归预测连续值,而分类预测是离散值),一般而言,回归问题用恒等函数,分类问题用softmax函数。恒等函数会将输入按原样输出,对于输入的信息
在这里插入图片描述

def softmax(a):
 exp_a = np.exp(a)
 sum_exp_a = np.sum(exp_a)
 y = exp_a / sum_exp_a
 return y

上面的softmax函数的实现虽然正确描述了式(3.10),但在计算机的运算上有一定的缺陷。这个缺陷就是溢出问题。softmax函数的实现中要进行指数函数的运算,但是此时指数函数的值很容易变得非常大。比如,e10的值会超过20000,e100会变成一个后面有40多个0的超大值,e1000的结果会返回一个表示无穷大的inf。如果在这些超大值之间进行除法运算,结果会出现“不确定”的情况。
在这里插入图片描述

扫描二维码关注公众号,回复: 10497100 查看本文章
def softmax(a):
 c = np.max(a)
 exp_a = np.exp(a - c) # 溢出对策
 sum_exp_a = np.sum(exp_a)
 y = exp_a / sum_exp_a
 return y


>>> a = np.array([0.3, 2.9, 4.0])
>>> y = softmax(a)
>>> print(y)
[ 0.01821127 0.24519181 0.73659691]
>>> np.sum(y)
1.0

比如,上面的例子可以解释成y[0]的概率是0.018(1.8 %),y[1]的概率是0.245(24.5 %),y[2]的概率是0.737(73.7 %)。从概率的结果来看,可以说“因为第2个元素的概率最高,所以答案是第2个类别”。也就是说,通过使用softmax函数,我们可以用概率的(统计的)方法处理问题。

发布了178 篇原创文章 · 获赞 140 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42146775/article/details/104534876