当前位置: 首页 > 面试题库 >

从不同的成本函数和神经网络的激活函数中进行选择

阎懿轩
2023-03-14
问题内容

最近,我开始玩弄神经网络。我正在尝试AND使用Tensorflow实施登机门。我无法理解何时使用不同的费用和激活功能。这是一个基本的神经网络,只有输入和输出层,没有隐藏层。

首先,我尝试以这种方式实现它。如您所见,这是一个较差的实现,但我认为它至少可以以某种方式完成工作。因此,我只尝试了真实的输出,没有人尝试过真实的输出。对于激活函数,我使用了S型函数,对于成本函数,我使用了平方误差成本函数(我认为是这样,如果我错了,请更正我)。

我已经尝试过使用ReLU和Softmax作为激活函数(具有相同的cost函数),但是它不起作用。我弄清楚了为什么它们不起作用。我还尝试了使用交叉熵成本函数的S型函数,它也无法正常工作。

import tensorflow as tf
import numpy

train_X = numpy.asarray([[0,0],[0,1],[1,0],[1,1]])
train_Y = numpy.asarray([[0],[0],[0],[1]])

x = tf.placeholder("float",[None, 2])
y = tf.placeholder("float",[None, 1])

W = tf.Variable(tf.zeros([2, 1]))
b = tf.Variable(tf.zeros([1, 1]))

activation = tf.nn.sigmoid(tf.matmul(x, W)+b)
cost = tf.reduce_sum(tf.square(activation - y))/4
optimizer = tf.train.GradientDescentOptimizer(.1).minimize(cost)

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    for i in range(5000):
        train_data = sess.run(optimizer, feed_dict={x: train_X, y: train_Y})

    result = sess.run(activation, feed_dict={x:train_X})
    print(result)

经过5000次迭代:

[[ 0.0031316 ]
[ 0.12012422]
[ 0.12012422]
[ 0.85576665]]

问题1- 是否有其他激活函数和成本函数可以在不更改参数的情况下(在不更改W,x,b的情况下)为上述网络工作(学习)。

[激活功能]选择取决于问题。

因此,没有可以在任何地方使用的成本函数吗?我的意思是,没有任何可用于任何神经网络的 标准 成本函数。对?请对此进行指正。

我还AND用另一种方法实现了门,将输出视为一成不变。正如您所看到的train_Y
[1,0]那样,第0个索引是1,所以答案是0。我希望您能得到它。

在这里,我使用了softmax激活函数,并将交叉熵作为代价函数。乙状结肠功能作为激活功能严重失败。

import tensorflow as tf
import numpy

train_X = numpy.asarray([[0,0],[0,1],[1,0],[1,1]])
train_Y = numpy.asarray([[1,0],[1,0],[1,0],[0,1]])

x = tf.placeholder("float",[None, 2])
y = tf.placeholder("float",[None, 2])

W = tf.Variable(tf.zeros([2, 2]))
b = tf.Variable(tf.zeros([2]))

activation = tf.nn.softmax(tf.matmul(x, W)+b)

cost = -tf.reduce_sum(y*tf.log(activation))

optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(cost)

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    for i in range(5000):
        train_data = sess.run(optimizer, feed_dict={x: train_X, y: train_Y})

    result = sess.run(activation, feed_dict={x:train_X})
    print(result)

经过5000次迭代

[[  1.00000000e+00   1.41971401e-09]
 [  9.98996437e-01   1.00352429e-03]
 [  9.98996437e-01   1.00352429e-03]
 [  1.40495342e-03   9.98595059e-01]]

问题3
那么在这种情况下,我可以使用哪些成本函数和激活函数?我如何了解应该使用哪种类型的费用和激活功能?是否有标准的方式或规则,或者仅是经验?我是否必须以蛮力方式尝试所有费用和激活功能?我在这里找到了答案。但我希望有更详尽的解释。

问题4
我注意到,要收敛到接近准确的预测需要花费很多迭代。我认为融合率取决于学习率(使用太多会丢失解决方案)和成本函数(如果我做错了请纠正我)。那么,是否有最佳方法(意味着最快)或成本函数收敛到正确的解决方案?


问题答案:

我将以较笼统的答案开始,最后以特定于您的特定实验的答案结束。

激活功能
实际上,不同的激活功能确实具有不同的属性。首先让我们考虑神经网络两层之间的激活函数。激活函数的唯一目的是充当非线性。如果您没有在两层之间放置激活函数,那么两层在一起将不会比一层更好,因为它们的效果仍然只是线性变换。长期以来,人们一直在使用S形函数和tanh,随意选择,S形函数更为流行,直到最近ReLU成为主要的非宽容性。人们之所以在各层之间使用ReLU是因为它不饱和(并且计算速度也更快)。考虑一下S形函数图。如果绝对值x值越大,则S形函数的导数就越小,这意味着当我们向后传播误差时,误差的梯度将在我们返回图层时迅速消失。使用ReLU时,导数适用1于所有正输入,因此,被激发的神经元的梯度不会被激活单元完全改变,也不会减慢梯度下降的速度。

对于网络的最后一层,激活单元还取决于任务。对于回归,您将需要使用S形或tanh激活,因为您希望结果在0到1之间。对于分类,您将只希望输出之一为1,其他所有零,但是没有可实现的不同方法正是这样,所以您将要使用softmax对其进行近似。

你的例子 。现在,让我们看一下您的示例。您的第一个示例尝试以AND以下形式计算的输出:

sigmoid(W1 * x1 + W2 * x2 + B)

请注意,W1W2始终会收敛到相同的值,因为(x1x2)的输出应等于(x2x1)的输出。因此,您适合的模型是:

sigmoid(W * (x1 + x2) + B)

2。由于双曲线函数是相当顺利,这将需要非常大的价值W,并B`使输出接近期望,但因为小的学习率,他们不能去那些大的值快。在第一个示例中,提高学习速度将提高收敛速度。

您的第二个示例收敛得更好,因为该softmax函数擅长使一个输出等于1和所有其他输出等于0。由于这正是您的情况,因此确实可以迅速收敛。请注意,sigmoid这最终也将收敛为良好的值,但是将需要更多的迭代(或更高的学习率)。

使用什么 。现在到最后一个问题,如何选择要使用的激活和成本函数。这些建议适用于大多数情况:

  1. 如果进行分类,则softmax用于最后一层的非线性和cross entropy成本函数。

  2. 如果进行回归,则将sigmoidtanh用于最后一层的非线性,并将其squared error用作成本函数。

  3. 将ReLU用作图层之间的非线性。

  4. 使用更好的优化(AdamOptimizerAdagradOptimizer而不是)GradientDescentOptimizer,或使用势头较快的收敛,



 类似资料:
  • 本文向大家介绍问题:神经网络激活函数?相关面试题,主要包含被问及问题:神经网络激活函数?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: sigmod、tanh、relu 解析:需要掌握函数图像,特点,互相比较,优缺点以及改进方法

  • 神经网络的输入层使用激活函数,还是仅仅是隐藏层和输出层?

  • 我试着运行一个没有任何激活函数的简单神经网络,并且网络不会收敛。我正在使用MSE成本函数进行MNIST分类。 然而,如果我将校正线性激活函数应用于隐藏层(输出=max(0,x),其中x是加权和),那么它会很好地收敛。 为什么消除前一层的负面输出有助于学习?

  • 我正在学习神经网络,并在python中实现它。我首先定义了一个 softmax 函数,我遵循这个问题给出的解决方案 Softmax 函数 - python。以下是我的代码: 我得到了一个测试代码,看看函数是否正确。是测试数据,

  • 在讲反向传播算法时,我们用均方差损失函数和Sigmoid激活函数做了实例,首先我们就来看看均方差+Sigmoid的组合有什么问题。 首先我们回顾下Sigmoid激活函数的表达式为:$$sigma(z) = frac{1}{1+e^{-z}}$$ $$sigma(z)$$的函数图像如下: 从图上可以看出,对于Sigmoid,当z的取值越来越大后,函数曲线变得越来越平缓,意味着此时的导数$$sigma

  • 我试图在DL4j中做一个简单的预测(稍后将用于具有n个特性的大型数据集),但无论我做什么,我的网络都不想学习,行为非常奇怪。当然,我学习了所有的教程,并执行了dl4j repo中显示的相同步骤,但不知何故,它对我不起作用。 对于虚拟特性,我使用以下数据: *双[val][x]特征;其中val=linspace(-10,10)...;和x=math.sqrt(math.abs(val))*val;

  • 激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。 Sigmoid 也成为 S 形函数,取值范围为 (0,1)。Sigmoid 将一个实数映射到 (0,1) 的区间,可以用来做二分类。Sigmoid 在特征相差比较复杂或是相差不是特别大时效果比较好。 sigmoid 缺点: 激活函数计算量大(指数运算),反向传播求误差梯度时,求导

  • 激活函数可以通过设置单独的激活层实现,也可以在构造层对象时通过传递activation参数实现。 from keras.layers import Activation, Dense model.add(Dense(64)) model.add(Activation('tanh')) 等价于 model.add(Dense(64, activation='tanh')) 也可以通过传递一个逐