Python表达sigmoid激活函数对应的梯度下降函数
时间: 2023-11-05 15:30:10 浏览: 50
sigmoid激活函数的数学表达式为:
$f(x) = \frac{1}{1 + e^{-x}}$
其对应的梯度下降函数可以通过链式法则推导得到:
$\frac{\partial L}{\partial w} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial z} \cdot \frac{\partial z}{\partial w}$
其中,$L$为损失函数,$y$为sigmoid激活函数的输出,$z$为线性变换的输出。
根据sigmoid函数的导数公式:
$\frac{\partial y}{\partial z} = y(1-y)$
将其代入上式中,得到:
$\frac{\partial L}{\partial w} = \frac{\partial L}{\partial y} \cdot y(1-y) \cdot x$
其中,$x$为输入特征。
相关问题
写一段感知器激活函数为sigmoid函数的梯度下降法实现与门
实现与门是一个简单的逻辑门,其输入为两个二进制数,输出为1当且仅当两个输入都为1。我们可以使用感知器来实现与门,其中激活函数为sigmoid函数,使用梯度下降法进行训练。
首先,我们需要定义输入和输出:
输入:$x_1$、$x_2$
输出:$y$
对于与门,我们可以列出真值表:
| $x_1$ | $x_2$ | $y$ |
| ----- | ----- | --- |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
我们可以看到,只有当 $x_1=1$ 且 $x_2=1$ 时,输出 $y=1$。因此,我们可以将权重 $w_1$ 和 $w_2$ 分别设置为1,阈值 $b$ 设置为-2,以使得感知器在输入为1时输出1,输入为0时输出0。
接下来,我们可以使用sigmoid函数作为激活函数,其公式为:
$$
\sigma(x) = \frac{1}{1+e^{-x}}
$$
sigmoid函数的导数为:
$$
\sigma'(x) = \sigma(x)(1-\sigma(x))
$$
使用梯度下降法进行训练,我们可以按照以下步骤进行:
1. 初始化权重 $w_1$、$w_2$ 和阈值 $b$;
2. 对于每个训练样本,计算感知器输出 $y$;
3. 计算误差 $e=y-t$,其中 $t$ 为期望输出;
4. 更新权重和阈值:$w_i = w_i - \eta \frac{\partial e}{\partial w_i}$,$b = b - \eta \frac{\partial e}{\partial b}$,其中 $\eta$ 为学习率;
5. 重复步骤2~4,直到误差足够小或达到最大迭代次数。
具体实现代码如下:
```python
import numpy as np
# sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# sigmoid函数的导数
def sigmoid_derivative(x):
return sigmoid(x) * (1 - sigmoid(x))
# 训练函数
def train(x, t, learning_rate, max_iter):
# 初始化权重和阈值
w = np.array([1, 1])
b = -2
# 迭代训练
for i in range(max_iter):
y = sigmoid(np.dot(x, w) + b) # 计算输出
e = t - y # 计算误差
dw = learning_rate * np.dot(e, x) # 计算权重的梯度
db = learning_rate * e.sum() # 计算阈值的梯度
w += dw # 更新权重
b += db # 更新阈值
# 判断误差是否足够小
if np.abs(e).sum() < 1e-6:
break
return w, b
# 测试函数
def test(x, w, b):
y = sigmoid(np.dot(x, w) + b)
return np.round(y)
# 测试与门
x_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
t_train = np.array([0, 0, 0, 1])
w, b = train(x_train, t_train, 0.1, 1000)
x_test = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
t_test = np.array([0, 0, 0, 1])
y_test = test(x_test, w, b)
print(y_test) # [0. 0. 0. 1.]
```
在上述代码中,我们首先定义了sigmoid函数和sigmoid函数的导数,然后实现了训练函数和测试函数。在训练函数中,我们使用梯度下降法进行训练,并返回最终的权重和阈值。在测试函数中,我们使用训练得到的权重和阈值对输入进行预测,并返回预测结果。
最后,我们使用与门作为测试例子进行测试。在测试中,我们先定义了训练集和测试集,然后调用训练函数进行训练,再调用测试函数进行预测。由于与门比较简单,所以只需要进行1000次迭代就可以达到很好的效果。最终的预测结果为 [0. 0. 0. 1.],与期望输出相同。
python画Sigmoid的函数图像和相应的梯度图像,横向并列在一张图上
以下是Python代码绘制Sigmoid函数和其梯度的图像:
```python
import numpy as np
import matplotlib.pyplot as plt
# 绘制Sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
x = np.linspace(-10, 10, 100)
y = sigmoid(x)
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.plot(x, y)
plt.title('Sigmoid函数')
# 绘制Sigmoid函数的梯度
def sigmoid_derivative(x):
return sigmoid(x) * (1 - sigmoid(x))
y_d = sigmoid_derivative(x)
plt.subplot(1, 2, 2)
plt.plot(x, y_d)
plt.title('Sigmoid函数的梯度')
plt.show()
```
运行以上代码,将得到下图:
![Sigmoid函数和梯度图像](https://img-blog.csdnimg.cn/2021072320530297.png)
阅读全文