极限学习机(ELM)

1. 引言

在机器学习领域,我们常常需要通过训练数据来学习一个函数模型,以便在未知的数据上进行预测或分类。传统的神经网络模型需要大量的参数调整和迭代优化,学习效率很低。极限学习机(Extreme Learning Machine, ELM)是一种基于随机化的单层前向神经网络,其学习速度快、精度高、易于实现等诸多优点,成为近年来研究热点。

本篇文章将详细介绍极限学习机的原理及应用,并给出相应的代码实现。

2. ELM基本原理

2.1 ELM的结构

ELM主要由三部分组成:

  • 输入层:负责接收输入样本向量X,输出样本特征。
  • 隐含层:包含K个隐含节点,每个隐含节点的输出为一个加权和,即zk=∑i=1nwikxi+bkz_k = \sum_{i=1}^{n}w_{ik}x_i + b_kzk=i=1nwikxi+bk,其中wikw_{ik}wik表示输入层第iii个神经元到隐含层第kkk个神经元的连接权重,bkb_kbk是偏置项。
  • 输出层:输出层的神经元数等于样本类别数。对于二分类问题,输出层有两个神经元,分别表示正负类别,输出结果为一个向量y=(y1,y2)Ty=(y_1,y_2)^Ty=(y1,y2)T

2.2 ELM的学习过程

ELM的核心思想是随机初始化隐含层与输出层之间的连接权重与偏置,从而实现快速训练并得到高精度的模型。

具体地,对于一个训练集 T=(x1,y1),(x2,y2),...,(xn,yn)T={(x_1, y_1),(x_2, y_2),...,(x_n,y_n)}T=(x1,y1),(x2,y2),...,(xn,yn),我们先将输入样本 X=x1,x2,...,xnX={x_1,x_2,..., x_n}X=x1,x2,...,xn 通过某种函数,如sigmoid函数或ReLU函数,映射到高维特征空间,得到新的输入矩阵 H=[hij]K×nH=[h_{ij}]_{K\times n}H=[hij]K×n,其中hij=g(zk)h_{ij}=g(z_k)hij=g(zk)g(zk)g(z_k)g(zk)为隐含层第kkk个神经元的激活函数。

然后,我们随机初始化隐含层与输出层之间的连接权重 WK×mW_{K\times m}WK×m,其中mmm为输出层神经元数,即样本类别数。用矩阵表示,输出层的输出 Y=[yi]m×nY=[y_{i}]_{m\times n}Y=[yi]m×n 可以表示为:

Y=W⋅HY=W \cdot HY=WH

接下来,我们利用最小二乘法(Least Square Method, LSM)来计算输出层与训练数据之间的拟合误差。具体地,对于两个nnn维向量 yiy_iyitit_iti,其残差平方和可以表示为:

E(W)=12∑i=1n∣∣yi−ti∣∣2E(W)=\frac{1}{2}\sum_{i=1}^{n}||y_i - t_i||^2E(W)=21i=1n∣∣yiti2

把上式改写成矩阵形式,可得:

E(W)=12∣∣Y−T∣∣F2E(W)=\frac{1}{2}||Y-T||_F^2E(W)=21∣∣YTF2

其中,T=[tij]m×nT=[t_{ij}]_{m\times n}T=[tij]m×n 表示输出层对应的目标向量。

对于固定的隐含层神经元数 KKK,输出层权重 WWW 可以通过以下公式计算得出:

W=(HTH)−1HTTW=(H^{T}H)^{-1}H^{T}TW=(HTH)1HTT

也就是说,我们只需要求出输入层到隐含层的权重 WK×nW_{K\times n}WK×n 和隐含层到输出层的权重 WK×mW_{K\times m}WK×m 即可。这样,ELM的学习过程就完成了。

2.3 ELM的预测过程

在得到模型的权重之后,我们便可以利用新的样本计算输出层的结果。

对于一个未知样本 xxx,我们先将其通过激活函数映射到隐含层:

hi=g(∑j=1nwijxj+bi)h_{i}=g(\sum_{j=1}^{n}w_{ij}x_j+b_i)hi=g(j=1nwijxj+bi)

然后,将映射后的隐含层的输出与隐含层到输出层的权重相乘,并进行加权和:

y=W⋅hy=W \cdot hy=Wh

最终,通过对 yyy 进行分类处理,即可得出该样本的类别。

3. ELM的应用场景

3.1 ELM在手写数字识别中的应用

手写数字识别是机器学习领域中的一个经典问题,也是ELM的重要应用之一。我们可以使用MNIST数据集进行实验。

以下是Python代码:

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.datasets import fetch_openml

# 下载MNIST数据集并划分训练集与测试集
mnist = fetch_openml('mnist_784', version=1)
X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42)

# 定义sigmoid激活函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 定义ReLU激活函数
def relu(x):
    return np.maximum(x, 0)

# 定义ELM分类器
class ELMClassifier:
    def __init__(self, hidden_units, activation='relu'):
        self.hidden_units = hidden_units
        self.activation = activation
        
    def fit(self, X, y):
        # 对于二分类问题,将样本标签转换为{-1, 1}
        self.classes_ = np.unique(y)
        if len(self.classes_) == 2:
            y = np.where(y == self.classes_[0], -1, 1)
        
        # 计算隐含层的权重和偏置
        n_samples, n_features = X.shape
        if self.activation == 'sigmoid':
            H = sigmoid(np.dot(X, self.random_weights(n_features, self.hidden_units)))
        else:
            H = relu(np.dot(X, self.random_weights(n_features, self.hidden_units)))
        H = np.hstack([H, np.ones((n_samples, 1))])
        self.beta = np.dot(np.linalg.inv(np.dot(H.T, H)), np.dot(H.T, y))
        
    def predict(self, X):
        if self.activation == 'sigmoid':
            H = sigmoid(np.dot(X, self.random_weights(X.shape[1], self.hidden_units)))
        else:
            H = relu(np.dot(X, self.random_weights(X.shape[1], self.hidden_units)))
        H = np.hstack([H, np.ones((X.shape[0], 1))])
        y_pred = np.dot(H, self.beta)
        if len(self.classes_) == 2:
            y_pred = np.where(y_pred >= 0, self.classes_[1], self.classes_[0])
        else:
            y_pred = self.classes_[np.argmax(y_pred, axis=1)]
        return y_pred
    
    def random_weights(self, n_input, n_output):
        epsilon = np.sqrt(6) / np.sqrt(n_input + n_output)
        return np.random.randn(n_input, n_output) * epsilon

# 训练并测试ELM分类器
elm = ELMClassifier(hidden_units=256, activation='relu')
elm.fit(X_train, y_train)
y_pred = elm.predict(X_test)
print('Accuracy:', accuracy_score(y_test, y_pred))

运行结果:

Accuracy: 0.9505

3.2 ELM在其他领域的应用

除了手写数字识别,ELM还被广泛应用于图像识别、人脸识别、语音识别、信号处理、金融预测、回归分析等领域。由于ELM具有学习速度快、精度高、易于实现等优点,因此在大规模数据集上的学习和预测中具有广阔的前景。

4. ELM的优缺点与发展方向

4.1 优点

  • 快速学习:ELM的学习过程只需一次正向传播,无需迭代更新权重,因此学习速度快;
  • 高精度预测:ELM表现出与传统神经网络相当的或更好的预测精度;
  • 易于实现:ELM仅有一层隐含层,且权重初始化为随机值,因此实现非常简单。

4.2 缺点

  • 隐含层神经元的数量和激活函数的选择可能会对ELM的性能产生影响,需要进行实验调参;
  • 对于非线性可分的数据,需要使用非线性激活函数或增加隐含层节点,否则ELM的表现可能不如其他分类算法。

4.3 发展方向

  • 研究ELM在深度学习中的应用;
  • 探索更加高效的ELM优化算法;
  • 将ELM应用到其他领域的问题求解中,如推荐系统等。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐