如果你正在读这篇文章,那么很可能你已经知道什么是神经网络,什么是激活函数,但是,一些关于机器学习的入门课程并不能很清楚地说明,为什么我们需要这些激活函数。我们需要它们吗?没有它们,神经网络还能工作吗?
首先让我们回顾一下关于神经网络的一些事情。它们通常被可视化地表示为一个类似图表的结构,如下图所示:
3
下图就是一些我们经常使用的激活函数,从这些激活函数的图像可以看出它们有的是局部线性的有的是非线性的,有的是一个函数表达式下来的,有的是分段的。但其表达式好像都不是很常见,给人一种应凑的感觉有没有?
def softmax(x):
RELU 线性整流单元
e_x = np.exp(x - np.max(x))
return e_x / e_x.sum()values_of_x = [i*0.01 for i in range(-500,500)]
plt.plot(scores ,softmax(values_of_x))
plt.xlabel("values of x")
plt.ylabel("value of softmax")
神经网络中用sigmoid函数作为激活函数,进行信号的转换,转换后的信号被传送给下一个神经元。
> For the full script, click here. Image by Author
线性激活函数。
具有像素坐标和时间坐标的SIREN可用于参数化视频。在这里,SIREN受到ground truth像素值的直接监督,并且比ReLU MLP更好地参数化视频。
ReLU函数在输入大于0时,直接输出该值,输入小于等于0,输出0
本质上来说,Leaky ReLU函数和Randomized ReLU函数都是单调的。 而且,它们的导数也单调。
deephub翻译组
卷积核(convolution kernel):在输出图像中每一个像素是输入图像中一个小区域中像素的加权平均的权值函数。卷积核可以有多个,卷积核参数可以通过误差反向传播来进行训练。
会议结束后,我一直在搜寻书籍,以找出最先了解这一事实的地方。我在Ian Goodfellow,Yoshua Bengio和Aaron Courville撰写的《深度学习》中找到了它。关于前馈神经网络[1]的页面168:
此类从我们的原始公式初始化β(s),bias(es)和n。调用该模型时,该模型执行与上述相同的过程以计算f(x)。最后,我们需要一个单变量线性回归,代表我们的最终方程:
最后,将它们代入我们的公式中:
就像我们之前所做的那样,让我们编写一些代码来测试此发现,以生成非平凡大小的神经网络并将线性回归拟合到其输入和输出。首先,创建随机前馈神经网络的函数:
def random_model():
inp = tf.keras.Input(shape=(INPUT_DIM,))
for layer in range(NUM_LAYERS):
if layer == 0:
x = tf.keras.layers.Dense(
np.random.randint(1, 1025),
bias_initializer='glorot_uniform'
)(inp)
else:
x = tf.keras.layers.Dense(
np.random.randint(1, 1025),
bias_initializer='glorot_uniform'
)(x)
out = tf.keras.layers.Dense(
OUTPUT_DIM,
bias_initializer='glorot_uniform'
)(x)
return tf.keras.Model(inputs=inp, outputs=out)
model = random_model()
X = np.random.uniform(size=(1024, INPUT_DIM))
y = model(X)
linear_model = LinearRegression().fit(X, y)
X_test = np.random.uniform(size=(1024, INPUT_DIM))
y_true = model(X_test)
y_pred = linear_model.predict(X_test)
print(f'r2 score: {r2_score(y_true, y_pred)}')
print(f'mse: {mean_squared_error(y_true, y_pred)}')
$ python3 ff_example.pyr2
score: 0.999999999999102
mse: 1.7702930123167377e-14
def random_model():
inp = tf.keras.Input(shape=INPUT_DIM)
for layer in range(NUM_LAYERS):
if layer == 0:
x = tf.keras.layers.Conv2D(
np.random.randint(1, 33),
(3, 3),
bias_initializer='glorot_uniform',
activation='linear'
)(inp)
else:
x = tf.keras.layers.Conv2D(
np.random.randint(1, 33),
(3, 3),
bias_initializer='glorot_uniform',
activation='linear'
)(x)
if np.random.uniform() > .5:
x = tf.keras.layers.AveragePooling2D()(x)
x = tf.keras.layers.Flatten()(x)
out = tf.keras.layers.Dense(OUTPUT_DIM, bias_initializer='glorot_uniform')(x)
return tf.keras.Model(inputs=inp, outputs=out)
mse: 7.416074040925858e-16
def random_model():
inp = tf.keras.Input(shape=INPUT_DIM)for layer in range(NUM_LAYERS):
if layer+1 == NUM_LAYERS:
l = tf.keras.layers.SimpleRNN(
np.random.randint(1, 129),
bias_initializer='glorot_uniform',
activation='linear'
)
else:
l = tf.keras.layers.SimpleRNN(
np.random.randint(1, 129),
return_sequences=True,
bias_initializer='glorot_uniform',
activation='linear'
)if layer == 0:
x = l(inp)
else:
x = l(x)out = tf.keras.layers.Dense(OUTPUT_DIM, bias_initializer='glorot_uniform')(x)
return tf.keras.Model(inputs=inp, outputs=out)
mse: 5.490464324395404e-08
XOr发音为“ Exclusive or”,是著名的逻辑连接词。[2]
神经网络没有所谓的“最重要”组件,但是,激活功能为该标题排在第一位提供了强有力的理由。在本文中,我们了解到没有任何非线性激活函数的前馈神经网络(无论是否包含递归层,卷积层,甚至池化层)都只是线性模型。我们通过数学符号,实验和多种可视化方法证明了这一事实。
[1] I. Goodfellow,Y。Bengio和A.Courville,《深度学习》(2016年),https:
//www.deeplearningbook.org/[2] Germundsson,Roger和Weisstein,Eric W.“异或”。来自MathWorld-Wolfram Web资源。
https://mathworld.wolfram.com/XOR.html