激活函数

1. 激活函数

20-æ¿æ´»å½æ°åå¶æ¢¯åº¦-æ¿æ´»å½æ°.jpg

导数:

20-æ¿æ´»å½æ°åå¶æ¢¯åº¦-ç¥ç»åæ¶æ.jpg

2.sigmoid函数

其实logistic函数也就是经常说的sigmoid函数,它的几何形状也就是一条sigmoid曲线(S型曲线)。A logistic function or logistic curve is a common “S” shape (sigmoid curve). 也就是说,sigmoid把一个值映射到0-1之间。

该函数具有如下的特性:当x趋近于负无穷时,y趋近于0;当x趋近于正无穷时,y趋近于1;当x= 0时,y=0.5. 把(−∞,+∞)的值压缩在0-1之间

优点:

1.Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层

2.求导容易,处处可导,导数为:f′(x)=f(x)(1−f(x))

缺点:

1.由于其软饱和性,容易产生梯度消失,导致训练出现问题。即,当|x|较大时sigmoid的偏导为0,所以参数得不到更新,此时则会有梯度消失现象发生。

2.其输出并不是以0为中心的。

import tensorflow as tf

a = tf.linspace(-10., 10., 10) # 均匀分布
a

<tf.Tensor: id=17, shape=(10,), dtype=float32, numpy=
array([-10.       ,  -7.7777777,  -5.5555553,  -3.333333 ,  -1.1111107,    1.1111116,   3.333334 ,   5.5555563,   7.7777786,  10.       ],
      dtype=float32)>

with tf.GradientTape() as tape:
    tape.watch(a)
    y = tf.sigmoid(a)

y

<tf.Tensor: id=19, shape=(10,), dtype=float32, numpy=
array([4.5418739e-05, 4.1875243e-04, 3.8510859e-03, 3.4445167e-02,
       2.4766389e-01, 7.5233626e-01, 9.6555483e-01, 9.9614894e-01,
       9.9958128e-01, 9.9995458e-01], dtype=float32)>

grads = tape.gradient(y, [a])
grads

[<tf.Tensor: id=24, shape=(10,), dtype=float32, numpy=
 array([4.5416677e-05, 4.1857705e-04, 3.8362551e-03, 3.3258699e-02,
        1.8632649e-01, 1.8632641e-01, 3.3258699e-02, 3.8362255e-03,
        4.1854731e-04, 4.5416677e-05], dtype=float32)>]

应用:

logistic函数在统计学和机器学习领域应用最为广泛或者最为人熟知的肯定是逻辑回归模型了。逻辑回归(Logistic Regression,简称LR)作为一种对数线性模型(log-linear model)被广泛地应用于分类和回归场景中。此外,logistic函数也是神经网络最为常用的激活函数,即sigmoid函数。

机器学习中一个重要的预测模型逻辑回归(LR)就是基于Sigmoid函数实现的。LR模型的主要任务是给定一些历史的{X,Y}

其中X是样本n个特征值,Y的取值是{0,1}代表正例与负例

通过对这些历史样本的学习,从而得到一个数学模型,给定一个新的X,能够预测出Y。LR模型是一个二分类模型,即对于一个X,预测其发生或不发生。

但事实上,对于一个事件发生的情况,往往不能得到100%的预测,因此LR可以得到一个事件发生的可能性,超过50%则认为事件发生,低于50%则认为事件不发生

从LR的目的上来看,在选择函数时,有两个条件是必须要满足的:

  1. 取值范围在0~1之间。
  2. 对于一个事件发生情况,50%是其结果的分水岭,选择函数应该在0.5中心对称。

从这两个条件来看,Sigmoid很好的符合了LR的需求。

 

3. softmax函数

3.1 softmax初探

在机器学习尤其是深度学习中,softmax是个非常常用而且比较重要的函数,尤其在多分类的场景中使用广泛。他把一些输入映射为0-1之间的实数,并且归一化保证和为1,因此多分类的概率之和也刚好为1。 
首先我们简单来看看softmax是什么意思。顾名思义,softmax由两个单词组成,其中一个是max。对于max我们都很熟悉,比如有两个变量a,b。如果a>b,则max为a,反之为b。用伪码简单描述一下就是 if a > b return a; else b。 
另外一个单词为soft。max存在的一个问题是什么呢?如果将max看成一个分类问题,就是非黑即白,最后的输出是一个确定的变量。更多的时候,我们希望输出的是取到某个分类的概率,或者说,我们希望分值大的那一项被经常取到,而分值较小的那一项也有一定的概率偶尔被取到,所以我们就应用到了soft的概念,即最后的输出是每个分类被取到的概率。

3.2 softmax的定义

首先给一个图,这个图比较清晰地告诉大家softmax是怎么计算的。

è¿éåå¾çæè¿°

假设有一个数组V,Vi表示V中的第i个元素,那么这个元素的softmax值为: 
                                                           S{_{i}}=\frac{e^{i}}{\sum_{j} e^{j}}

Si​代表的是第i个神经元的输出。

该元素的softmax值,就是该元素的指数与所有元素指数和的比值。
这个定义可以说很简单,也很直观。那为什么要定义成这个形式呢?原因主要如下。 
1.softmax设计的初衷,是希望特征对概率的影响是乘性的。 
2.多类分类问题的目标函数常常选为cross-entropy。 

其实就是在输出后面套一个这个函数,在推导之前,我们统一一下网络中的各个表示符号,避免后面突然出现一个什么符号懵逼推导不下去了。
首先是神经元的输出,一个神经元如下图:

神经元的输出设为:

                                                                           z_i=\sum_{j}w_{ij}x_{ij}+b

其中w_{ij}是第i个神经元的第j个权重,b是偏移值。zi表示该网络的第i个输出。

给这个输出加上一个softmax函数,那就变成了这样:

                                                                                     a{_{i}}=\frac{e^{z_i}}{\sum_{k} e^{z_k}}

a_i代表softmax的第i个输出值,右侧就是套用了softmax函数。

神经网络是用error back-propagation训练的,这个过程中有一个关键的量是\partial L/\partial z_i。后面我们会进行详细推导。

3.3 softmax求导

在神经网络反向传播中,要求一个损失函数,这个损失函数其实表示的是真实值与网络的估计值的误差,知道误差了,才能知道怎样去修改网络中的权重。

损失函数可以有很多形式,这里用的是交叉熵函数,主要是由于这个求导结果比较简单,易于计算,并且交叉熵解决某些损失函数学习缓慢的问题。交叉熵的函数是这样的:

                                                                      Loss=-\sum_{i}y_{i}lna_i

其中,y_i表示真实值,a_i表示求出的softmax值。

接下来对Loss求导,即loss对于神经元输出(z_i)的梯度, \frac{\partial Loss}{\partial z_i}
根据符合函数求导法则: 

                                                                     \frac{\partial Loss}{\partial z_i}=\sum_{j} (\frac{Loss_{j}}{\partial a_{j}} \frac{\partial a_j}{\partial z_i})

                                                     Loss=Loss_1+Loss_2+...+Loss_9 \\ Loss_i=-y_ilna_i

我们已经将数值映射到了0-1之间,并且和为1,则有:

                                                                     \frac{e^i}{\sum_j e^j} = 1 - \frac{\sum_{j \neq i} e^j}{\sum_j e^j}

接下来开始求导

(1) \frac{\partial Loss_j}{\partial a_j}=\frac{\partial (-y_jln a_j))}{\partial a_j}=-y_j\frac{1}{a_j}

(2) 分两种情况:

a. 如果i=j:

\frac{\partial a_i}{\partial z_i}=\frac{\partial (\frac{e^{z_i}}{\sum_{k}e^{z_k}}))}{\partial z_i}=\frac{\sum_{k}e^{z_k}e^{z_i}-(e^{z_i})^2}{(\sum_{k}e^{z_k})^2}=(\frac{e^{z_i}}{\sum_{k}e^{z_k}})(1-\frac{e^{z_i}}{\sum_{k}e^{z_k}}) \\ =a_i (1-a_i)

b. 如果i\neq j:

\frac{\partial a_j}{\partial z_i}=\frac{\partial (\frac{e^{z_j}}{\sum_{k}e^{z_k}}))}{\partial z_i}=-e^{z_j}(\frac{1}{\sum_{k}e^{z_k}})^2e^{z_i}=-a_i a_j

接下来,我们需要把上面的组合起来:

\frac{\partial Loss}{\partial z_i}=\sum_{j} (\frac{Loss_{j}}{\partial a_{j}} \frac{\partial a_j}{\partial z_i})=\sum_{j=i} (\frac{Loss_{j}}{\partial a_{j}} \frac{\partial a_j}{\partial z_i})+\sum_{j\neq i} (\frac{Loss_{j}}{\partial a_{j}} \frac{\partial a_j}{\partial z_i}) \\ =\sum_{j\neq i}{-y_i\frac{1}{a_j}(-a_ia_j)+(-y_i\frac{1}{a_i})( a_i(1-a_i))} \\ =\sum_{j\neq i}a_iy_j+(-y_i(1-a_i)) \\ =\sum_{j\neq i} a_iy_j+a_iy_j-y_i \\ = a_i\sum_{j}y_j-y_j

最后的结果看起来简单了很多,最后,针对分类问题,我们给定的结果y_i最终只会有一个类别是1,其他类别都是0,因此,对于分类问题,这个梯度等于:

 

3.4 softmax VS k个二元分类器

如果你在开发一个音乐分类的应用,需要对k种类型的音乐进行识别,那么是选择使用 softmax 分类器呢,还是使用 logistic 回归算法建立 k 个独立的二元分类器呢? 
这一选择取决于你的类别之间是否互斥,例如,如果你有四个类别的音乐,分别为:古典音乐、乡村音乐、摇滚乐和爵士乐,那么你可以假设每个训练样本只会被打上一个标签(即:一首歌只能属于这四种音乐类型的其中一种),此时你应该使用类别数 k = 4 的softmax回归。(如果在你的数据集中,有的歌曲不属于以上四类的其中任何一类,那么你可以添加一个“其他类”,并将类别数 k 设为5。) 
如果你的四个类别如下:人声音乐、舞曲、影视原声、流行歌曲,那么这些类别之间并不是互斥的。例如:一首歌曲可以来源于影视原声,同时也包含人声 。这种情况下,使用4个二分类的 logistic 回归分类器更为合适。这样,对于每个新的音乐作品 ,我们的算法可以分别判断它是否属于各个类别。 
现在我们来看一个计算视觉领域的例子,你的任务是将图像分到三个不同类别中。(i) 假设这三个类别分别是:室内场景、户外城区场景、户外荒野场景。你会使用sofmax回归还是 3个logistic 回归分类器呢? (ii) 现在假设这三个类别分别是室内场景、黑白图片、包含人物的图片,你又会选择 softmax 回归还是多个 logistic 回归分类器呢? 
在第一个例子中,三个类别是互斥的,因此更适于选择softmax回归分类器 。而在第二个例子中,建立三个独立的 logistic回归分类器更加合适。

4. Tanh

  • 类似于sigmoid函数,但是值域为[-1,1]

20-æ¿æ´»å½æ°åå¶æ¢¯åº¦-tanh.jpg

Derivative

import tensorflow as tf
a = tf.linspace(-5.,5.,10)
a

<tf.Tensor: id=29, shape=(10,), dtype=float32, numpy=
array([-5.        , -3.8888888 , -2.7777777 , -1.6666665 , -0.55555534,
        0.5555558 ,  1.666667  ,  2.7777781 ,  3.8888893 ,  5.        ],
      dtype=float32)>

tf.tanh(a)

<tf.Tensor: id=31, shape=(10,), dtype=float32, numpy=
array([-0.99990916, -0.9991625 , -0.99229795, -0.9311096 , -0.5046722 ,
        0.5046726 ,  0.93110967,  0.99229795,  0.9991625 ,  0.99990916],
      dtype=float32)>

5. Rectified Linear Unit

20-æ¿æ´»å½æ°åå¶æ¢¯åº¦-relu.jpg

Derivative

  • 减少sigmoid的梯度爆炸或者梯度消失的现象
import tensorflow as tf
a = tf.linspace(-1.,1.,10)
a

<tf.Tensor: id=36, shape=(10,), dtype=float32, numpy=
array([-1.        , -0.7777778 , -0.5555556 , -0.3333333 , -0.1111111 ,
        0.11111116,  0.33333337,  0.5555556 ,  0.7777778 ,  1.        ],
      dtype=float32)>

tf.nn.relu(a)

<tf.Tensor: id=38, shape=(10,), dtype=float32, numpy=
array([0.        , 0.        , 0.        , 0.        , 0.        ,
       0.11111116, 0.33333337, 0.5555556 , 0.7777778 , 1.        ],
      dtype=float32)>

tf.nn.leaky_relu(a)

<tf.Tensor: id=40, shape=(10,), dtype=float32, numpy=
array([-0.2       , -0.15555556, -0.11111112, -0.06666666, -0.02222222,
        0.11111116,  0.33333337,  0.5555556 ,  0.7777778 ,  1.        ],
      dtype=float32)>

 

附录

求导法则和公式

 

 

 

 

 

 

 

<think>首先,用户的问题是在MATLAB中实现Sigmoid激活函数,输入范围x从-10到10。我需要根据系统级指令来构建回答。 系统级指令的关键点: - 所有行内数学表达式必须使用$...$格式,例如:$x^2$。 - 独立公式必须使用$$...$$$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考引用: - 引用[1]:提供了MATLAB代码绘制sigmoid和ReLU函数。 - 引用[2]:讨论了sigmoid激活函数的应用。 - 引用[3]:详细介绍了sigmoid函数的特性和硬件实现。 - 引用[4]:提供了MATLAB代码实现sigmoid、tanh和ReLU函数。 用户需求:实现Sigmoid激活函数在MATLAB中,输入x从-10到10。 Sigmoid函数的公式是: $$\sigma(x) = \frac{1}{1 + e^{-x}}$$ 在回答中,我需要使用LaTeX格式: - 行内表达式:$ \sigma(x) = \frac{1}{1 + e^{-x}} $ - 独立公式时:单独成段用$$...$$ 回答结构: 1. 介绍Sigmoid函数:简要解释Sigmoid激活函数是什么。 2. MATLAB代码实现:提供代码来实现Sigmoid函数,并绘制图形。 3. 解释代码:简要解释代码的关键部分。 4. 添加引用:在相关内容末尾添加引用标识。 5. 生成相关问题:在最后添加相关问题。 生成相关问题:根据系统指令,我需要生成相关问题。例如: - Sigmoid函数的优缺点是什么? - 如何在MATLAB中优化Sigmoid函数的计算? - Sigmoid函数在神经网络中的应用场景? 引用标识:我需要自然地添加引用。参考引用中,[^1]到[^4]提供了相关信息。在回答中,当提到Sigmoid函数的定义或实现时,可以添加引用,比如:[^1]或[^2]。 MATLAB代码实现: 基于引用[1]和[4],代码可以是: ```matlab % 定义x范围 x = linspace(-10, 10, 100); % 从-10到10,生成100个点 % 计算Sigmoid sigmoid = 1 ./ (1 + exp(-x)); % 绘图 figure; plot(x, sigmoid, 'r'); title('Sigmoid激活函数'); xlabel('x'); ylabel('\sigma(x)'); grid on; axis([-10, 10, 0, 1]); % 设置坐标轴范围 ``` 在回答中,我需要确保代码正确,并解释关键部分。 完整回答结构: 1. **介绍Sigmoid函数**:Sigmoid激活函数常用于神经网络中,它将输入映射到(0,1)区间,公式为$ \sigma(x) = \frac{1}{1 + e^{-x}} $ [^2]。 2. **MATLAB代码实现**:提供代码块。 3. **代码解释**:解释linspace, exp, 绘图命令等。 4. **添加引用**:在相关句子末尾。 5. **相关问题**:在最后添加。 生成相关问题: - 1. Sigmoid函数的导数是什么?如何在MATLAB中计算? - 2. Sigmoid函数与其他激活函数如ReLU或tanh相比有什么优缺点? - 3. 在神经网络中,Sigmoid函数主要用于什么层? 确保回答真实可靠:基于提供的引用,代码是合理的。 最终回答: - 用中文。 - 清晰结构。</think>### MATLAB实现Sigmoid激活函数(输入范围x从-10到10) Sigmoid激活函数是神经网络中常用的非线性函数,它将任意实数输入映射到(0,1)区间,常用于输出层表示概率或归一化处理[^2]。其数学公式定义为: $$\sigma(x) = \frac{1}{1 + e^{-x}}$$ 其中,$x$ 是输入值,$e$ 是自然常数。该函数具有平滑的S形曲线,在生物神经元模拟中应用广泛[^3]。 以下是在MATLAB中实现Sigmoid函数的完整代码,输入范围$x$ 从-10到10。代码包括数据生成、函数计算和图形绘制,确保结果可视化清晰。 ```matlab % 设置输入范围:x从-10到10,生成100个等间距点 x = linspace(-10, 10, 100); % 计算Sigmoid激活函数值 sigmoid = 1 ./ (1 + exp(-x)); % 应用公式 σ(x) = 1/(1 + e^{-x}) % 绘制Sigmoid函数曲线 figure; plot(x, sigmoid, 'r', 'LineWidth', 2); % 红色曲线,线宽为2 title('Sigmoid激活函数 (x \in [-10, 10])'); xlabel('输入 x'); ylabel('输出 \sigma(x)'); grid on; % 显示网格线 axis([-10, 10, 0, 1]); % 设置坐标轴范围:x轴[-10,10],y轴[0,1] legend('sigmoid', 'Location', 'best'); % 添加图例 ``` #### 代码解释: 1. **输入范围设置**: `x = linspace(-10, 10, 100)` 生成从-10到10的100个等间距点,确保曲线平滑。您可以通过调整点数(如改为200)来提高精度。 2. **Sigmoid计算**: `sigmoid = 1 ./ (1 + exp(-x))` 直接实现了公式 $ \sigma(x) = \frac{1}{1 + e^{-x}} $。这里使用向量化操作,高效计算所有点[^1]。 3. **绘图命令**: - `plot(x, sigmoid, 'r')` 绘制红色曲线。 - `axis([-10, 10, 0, 1])` 限制坐标轴范围,突出Sigmoid在边界的行为(如当 $x \to -\infty$ 时 $\sigma(x) \to 0$,当 $x \to +\infty$ 时 $\sigma(x) \to 1$)[^4]。 - `grid on` 添加网格线,便于观察函数值变化。 运行此代码后,将显示Sigmoid函数的S形曲线(如下图示意),输出在x=0时为0.5,并在两端渐近于0和1。 ![Sigmoid曲线示意图](https://via.placeholder.com/400x200.png?text=Sigmoid+函数曲线) *图:Sigmoid函数在[-10,10]的典型输出(红色曲线)[^1][^4]。* #### 注意事项: - **计算效率**:MATLAB的`exp`函数已优化,适用于向量输入。对于大规模数据,可预分配数组(如 `sigmoid = zeros(size(x))`)以提升性能[^3]。 - **数值稳定性**:当 $|x|$ 较大时(如 $x > 10$),$e^{-x}$ 可能下溢,但在此输入范围内无此问题。 - **应用扩展**:此代码可直接集成到神经网络模型中,作为激活层使用[^2]。 如果您需要进一步分析(如计算导数或比较其他激活函数),请参考以下相关问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值