1、原理簡介
maxout激發(fā)函數(shù),則其隱含層節(jié)點的輸出表達式為:

這里的W是3維的,尺寸為d*m*k,其中d表示輸入層節(jié)點的個數(shù),m表示隱含層節(jié)點的個數(shù),k表示每個隱含層節(jié)點對應了k個”隱隱含層”節(jié)點,這k個”隱隱含層”節(jié)點都是線性輸出的,而maxout的每個節(jié)點就是取這k個”隱隱含層”節(jié)點輸出值中最大的那個值。因為激發(fā)函數(shù)中有了max操作,所以整個maxout網(wǎng)絡也是一種非線性的變換。
下圖可以幫你直觀的認識什么是maxout激活函數(shù)(下圖中k=3):

maxout的擬合能力是非常強的,它可以擬合任意的的凸函數(shù)。最直觀的解釋就是任意的凸函數(shù)都可以由分段線性函數(shù)以任意精度擬合,而maxout又是取k個隱隱含層節(jié)點的最大值,這些”隱隱含層"節(jié)點也是線性的,所以在不同的取值范圍下,最大值也可以看做是分段線性的(分段的個數(shù)與k值有關)。論文中的圖如下(它表達的意思就是可以擬合任意凸函數(shù),當然也包括了ReLU了):

2、Maxout與Dropout
Dropout是一種網(wǎng)絡規(guī)則化技巧,其實它就是相當于在訓練很多個不同的網(wǎng)絡結構,盡管如此,推理階段所有不同結構的參數(shù)依然是共享的,因為實際上只有一個網(wǎng)絡存在。
在機器學習算法中,有一個概念叫做bagging,bagging就相當于提供了一種投票機制,對于一個任務,我們不是僅僅使用一個模型來做出決策,而是通過多個模型的平均來決定最終的決策。
由于在Dropout中僅僅只有一個模型,因此無法進行平均操作,取而代之的是將模型的權重乘以Dropout比率p,這個做法在線性激活函數(shù)中表現(xiàn)尚可,但是如果是經(jīng)過非線性激活函數(shù)那就不準確了。而Maxout模型的仿射變換中沒有非線性激活函數(shù),因此我們也可以在此變換中引入Dropout技巧,并且實驗表明Maxout與Dropout的結合效果比較好。
3、Maxout的tensorflow實現(xiàn)
import tensorflow as tf
x = tf.random_normal([1,3])
m = 4
k = 3
d = x.get_shape().as_list()[-1]
W = tf.Variable(tf.random_normal(shape=[d, m, k]))
b = tf.Variable(tf.random_normal(shape = [m, k]))
dot_z = tf.tensordot(x, W, axes=1) + b
z = tf.reduce_max(dot_z, axis=2)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run([x,dot_z,z]))