最近在看教授很久之前的一篇 Paper ,里面有提到极限学习机(ELM),所以查找资料了解了一下。在查找的过程中,发现很多人抨击 ELM,说其是夸大了贡献,连 Yann LeCun 也公开怼过。也有很多人说 ELM 的训练速度很快且泛化能力好。褒贬不一,不管怎么样,了解学习一下,总是没有错的。
极限学习机(英文:Extreme Learning Machines,缩写ELM),又名超限学习机,为人工智能机器学习领域中的一种人工神经网络模型,是一种求解单隐层前馈神经网络的学习算法。-- 摘自维基百科
极限学习机是新加坡南洋理工大学黄广斌教授建立的一个模型,即一个单隐藏的前馈神经网络。但是与传统的前馈神经网络不同,ELM 的主要思想是:(机器或生物)学习可以不需要调整隐层节点,也就是说 ELM 网络隐藏层节点的权重随机生成或者人工定义,学习过程仅需计算输出权重。
ELM 结构 - 摘自黄教授的 PPT
在一个 ELM 的单隐层结构中,会有如下一些定义:
其中 ai 和 bi 是第 i 个隐藏节点的参数,ai 是输入权重。hi(x) 为激活函数。 所以,整个隐藏层的输出映射为:
其中 βi 是第 i 个隐藏节点的输出权重。 所以,整个隐藏层的输出为:
其中 C 为正则化系数(regularization coefficient)。 奇异值分解(single value decomposition, SVD)可用于求解权重系数:
其中 ui 为 HHT 的特征向量,di 为 H 的特征值。
对于给定 N 组训练数据,使用 ELM 对包含 L 个隐含层和 M 个输出层的单隐层网络结构有如下步骤:
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(a, b, x):
'''
定义Sigmoid函数: g(z) = 1/(1+e^-(ax+b))
'''
return 1.0/(1+np.exp(-1.0*(x.dot(a)+b)))
def ELM_prototype(X, T, C, n, L):
'''
回归问题的ELM标准算法
变量:X - 输入数据;样本数x特征数(N*n)
:H - 输出矩阵;样本数x隐含层节点数(N*L)
:T - 学习目标;样本数x输出层节点数(N*M)
:C - 正则化系数
'''
# 随机初始化
a = np.random.normal(0, 1, (n, L))
b = np.random.normal(0, 1)
# 使用特征映射求解输出矩阵
H = sigmoid(a, b, X)
# 计算输出权重和输出函数
HH = H.T.dot(H); HT = H.T.dot(T)
beta = np.linalg.pinv(HH+np.identity(L)/C).dot(HT)
Fl = H.dot(beta)
# 返回计算结果
return beta, Fl
# 测试:构造输入值和训练目标(输入变量n=2; 输出变量m=1)
x1 = np.linspace(1, 20, 150)
x2 = np.linspace(-5, 5, 150)
X = np.vstack([x1, x2]).T
T = np.sin(x1*x2/(2*np.pi))+np.random.normal(0, 0.2, 150)
# 使用ELM算法进行学习(隐含层节点数L=100; 正则化参数C=1e5)
beta, Fl = ELM_prototype(X, T, C=1e5, n=2, L=100)
# 绘制学习结果
plt.plot(x1, T, lw=1.5, label='Training goal')
plt.plot(x1, Fl, lw=3, label='ELM output')
plt.legend()
[1]. 极限学习机 - 维基百科 [2]. 极限学习机 - 百度百科 [3]. 黄广斌教授 2016 年中国软件大会演讲 PPT [4]. 知乎 - Extreme learning machine (ELM) 到底怎么样,有没有做的前途? [5]. What's so great about "Extreme Learning Machines"? - Yann LeCun