每当复制代码的时候,经常发现一个叫激活函数的东西,看下面的代码:
model = Sequential([
Flatten(input_shape=(28,28)),
Dense(128, activation='relu'),
Dense(10, activation='softmax')
])
其中类似activation='relu'
形状的,就是激活函数。
那么问题来了,为什么要有它?他能干啥?
我们知道,人工智能的神经网络模仿的就是人类的神经元。
看,它有好多触角,每个触角都能接收到不同的信息,他们对信息也都有自己的判断,最终汇总到一起,然后继续往下传递,最终到大脑,你做出个决策:快跑!
单看某一个神经元,他的输入输出是这样的:Y = X1×W1+X2×W2+X3×W3。
到神经网络里面,只不过变成多维矩阵加权而已。
其实,这种工作方式是就是加权求和。
加权求和这种方式,是一个线性模型,它有一个局限,那就是无论多少层叠加,他都是一个线性模型。
线性模型解决不了非线性问题。
多少篇文章,里面都说激活函数是为了去线性化。就这么一个“线性”,让多少小白折戟沉沙,从此再也不看人工智能。
那么这个线性到底指什么?
线性就是不拐弯,愣头青,没数。y = kx + b
,随着变量变大,结果也变大。有多大变大多,有多小变多小,正负无穷。
但是,实际应用中,我们要的结果并不是这样。
举几个例子:
现实生活中,很少有线性的事物,一个人再有钱,也是有数额的。都说头发无数根,其实也是有数量的。
所以,神经网络要应用到生活中,就必须去线性。因此,就需要在神经网络的层上再套一个激活函数。
可以来TensorFlow游乐场来试验下面的例子。
一条线可以轻松地把两种样本分离开来。
如果是下面的这种样本,一条直线是解决不了的。
如果在加权求和上再包一层激活函数:y=function(kx+b),变成函数套函数,这样就不是线性模型了,可以很轻易地区分。
把输入按照某种特定的规则映射到输出,这就是激活函数的作用。
下面这个高尔顿板,相当于在自由下落外面加了一层激活函数,就很形象地说明了它所起的作用。
如果换一种激活函数,输入都是一样,但是输出的分布却是另一种情况。
所以,不同的激活函数会有不同的效果,下面我们看看都有哪些激活函数。
sigmoid函数也叫Logistic函数,也是生物学中常见的一个函数,称为S型生长曲线。
记得生物老师讲过,当环境差时,生物种群增长缓慢。随着环境越来越好,生物种群快速增长。当增长到一定数量后,受到相互竞争的压力,种群数量趋于稳定。
因为它不是无限增长,另外它会将全部输入映射到0~1的区间内,所以在信息科学中,Sigmoid函数常被用作神经网络的激活函数,可以用来做二分法。
比如:做文本情感分析《NLP基础-中文语义理解:豆瓣影评情感分析》时,最后一层就用了sigmoid作为激活函数。
model = Sequential([
Embedding(vocab_size, embedding_dim, input_length= max_length),
GlobalAveragePooling1D(),
Dense(64, activation='relu'),
Dense(1, activation='sigmoid')
])
当输入一段文本后,最终输出1个数值,数值在0~1之间。0代表差评, 1代表好评。
"很好,演技不错", 0.91799414 ===>好评
"要是好就奇怪了", 0.19483969 ===>差评
"一星给字幕", 0.0028086603 ===>差评
"演技好,演技好,很差", 0.17192301 ===>差评
"演技好,演技好,演技好,演技好,很差" 0.8373259 ===>好评
tanh是双曲正切函数,下面是它的公式和图像。
它的形状和sigmoid有点像,只不过输出区间变成了-1到1。
相比sigmoid,它很好地解决了以0为中心的问题。
ReLU称为线性整流函数(Rectified Linear Unit),又称修正线性单元。
相比于sigmoid和tanh,线性整流函数有很多优势:
如果你构建神经网络时,不知道该用哪个激活函数,那就用ReLU。
softmax被称为归一化指数函数,它是在sigmoid二分类上进行的多分类推广,目的是将多分类的结果以概率的形式展现出来。
softmax在业内一直有一个争议点:它算不算激活函数?
从我这里看,它算式一个激活函数。
Softmax主要解决多类别分类问题,解决只有唯一正确答案的问题,它以概率形式输出多个分类的可能性,输出是互斥的,所有输出的概率和接近1。
比如手写数字识别,最后一层就是用的softmax:Dense(10, activation='softmax')
,输出0~9这10个分类的概率。
[[2.3691061e-11 1.0000000e+00 5.5736946e-14 1.7459076e-10 1.8988343e-13
8.0071365e-31 1.2010425e-14 0.0000000e+00 6.0655720e-20 1.8470960e-27]]
然后调用np.argmax(p)
就可以得出概率列表中最大概率的索引是1。
以上就是关于激活函数的知识点。
阅读量:2007
点赞量:0
收藏量:0