xinmeng_wit 发表于 2024-8-20 21:15

《人工智能实践教程》5、神经网络输出层的设计

<p>神经网络可以用于解决分类问题和回归问题,但需要根据情况改变输出层的激活函数。一般而言,回归问题用恒等函数,分类问题用Softmax函数。</p>

<p><strong>一、恒等函数和Softmax函数</strong></p>

<pre ng-bind-html="message.MMActualContent">
恒等函数将输入原样输出,即对于输入的信息,不做任何改动直接输出。因此,当输出层使用恒等函数时,输入信号被原封不动地输出。
用神经网络表示恒等函数的处理过程,如下图所示。与隐藏层的激活函数一样,恒等函数的转换处理可以用一个箭头表示。</pre>

<div style="text-align: left;"></div>

<pre ng-bind-html="message.MMActualContent">
在分类问题中使用的Softmax函数可用下式表示:
<img alt="y_{k} = \frac{exp(a_{k})}{\sum exp(a_{i})}" src="https://bbs.eeworld.com.cn/gif.latex?y_%7Bk%7D%20%3D%20%5Cfrac%7Bexp%28a_%7Bk%7D%29%7D%7B%5Csum%20exp%28a_%7Bi%7D%29%7D" />
其中,i取1~n.
式中表示输出层共有n个神经元,计算第k个神经元的输出<img alt="y_{k}" src="https://bbs.eeworld.com.cn/gif.latex?y_%7Bk%7D" />由式可见,Softmax函数的分子是输入信号<img alt="a_{k}" src="https://bbs.eeworld.com.cn/gif.latex?a_%7Bk%7D" />的指数函数,分母是所有输入信号的指数函数的和。</pre>

<p><strong>二、实现Softmax函数的注意事项</strong></p>

<p>在上面的softmax函数的公式中,如果按照公式直接计算,可能存在溢出问题,因为在实现时要进行指数函数的运算,其值容易变得很大。如果溢出,会出现结果不确定的情况。</p>

<p>因此,对softmax函数的实现可以进行如下改进:</p>

<div style="text-align: left;"></div>

<p>首先,分子和分母都乘以任意的常数C。然后把常数C移到exp中,记为lnC,最后用符号C&#39;替换lnC。</p>

<p>上面的公式说明,在进行指数运算时,加上(或减去)某个常数并不会改变计算结果。</p>

<p>为防止溢出,C&#39;一般使用输入信号的最大值。</p>

<p>改进后的代码如下:</p>

<pre>
<code class="language-python">def Softmax:
c = np.max(a)
exp_a = np.exp(a - c)# 溢出对策
sum_exp_a = np.sum(exp_a)
y = exp_a/sum_exp_a
return y</code></pre>

<p><strong>三、Softmax函数的性质</strong></p>

<p>Softmax函数的输出为0~1之间的实数。并且,Softmax函数的输出总和为1.</p>

<p>输出总和为1是Softmax函数的一个重要的性质。正因为这个性质,可以把Softmax函数的输出解释为&ldquo;概率&rdquo;。</p>

<p>因此,通过使用Softmx函数,可以用概率统计的方法处理问题。</p>

<p>注意:即使使用了Softmax函数,各类之间的大小关系也不会改变。原因是指数函数是单调递增函数。</p>

<p>&nbsp;</p>
页: [1]
查看完整版本: 《人工智能实践教程》5、神经网络输出层的设计