Extreme Learning Machine – ELM

Hoje vamos apresentar uma Extreme Learning Machine (ELM, ou em português, máquina de aprendizado extremo), algoritmo proposto por Huang [1,2] e que nada mais é do que uma rede neural artificial (RNA) de apenas uma camada oculta. O princípio de funcionamento da ELM é o mesmo de uma RNA, todavia a metodologia de treinamento de uma ELM não é baseada em gradiente descendente. Com isso o algoritmo escapa das principais deficiências do backpropagation: convergência lenta e convergência para mínimos locais. Segundo [2] o treinamento de uma ELM pode ser milhares de vezes mais rápido do que o treinamento via backpropagation (e de fato é). Para ilustras a arquitetura de uma ELM, podemos utilizar a mesma figura do post de RNA, porém com k = 1, ou seja, temos apenas uma camada oculta. (Se você não se sente confortável com os termos utilizados até aqui, leia nosso post sobre RNA)

redeFeed

Fig 1: arquitetura de uma rede neural artificial. A ELM utiliza apenas uma camada oculta, portanto, k = 1

O vetor \mathbf{X} é a entrada da rede. Os pesos de conexão da camada de entrada são alocados em uma matriz denominada \mathbf{W} e já os da camada oculta em uma matriz denominada \boldsymbol{\beta}. Para facilitar e agilizar os cálculos, os bias dos neurônios da camada oculta também são alocados em na última linha de \mathbf{W}, e os bias da camada de saída não são utilizados na ELM. A modelagem matricial do ELM é descrita a seguir:

  \mathbf{X} = [x_1, \cdots, x_m, 1]  \qquad  \mathbf{W} = \begin{bmatrix}  w_{11}& \cdots & w_{1d} \\  \vdots & \ddots & \vdots \\  w_{m1}& \cdots & w_{md} \\  b_1 & \cdots & b_d  \end{bmatrix}  \qquad  \boldsymbol{\beta} = \begin{bmatrix}  \beta_{11}& \cdots & \beta_{1s} \\  \vdots & \ddots & \vdots \\  \beta_{d1}& \cdots & \beta_{ds}  \end{bmatrix}  \qquad  \mathbf{Y} = [y_1, \cdots , y_s]

onde m é o número de neurônios de entradas, d é o número de neurônios na camada oculta e s é o número de neurônios de saída da rede.

Treinamento

O treinamento da ELM é realizado de maneira analítica, diferentemente da abordagem iterativa do backpropagation. A matriz \mathbf{W} é gerada de maneira aleatória e não é alterada até o fim do algoritmo. Portanto, o objetivo do treinamento da ELM é encontrar a matriz de pesos \boldsymbol{\beta}, baseado na matriz de saída \mathbf{Y} e na matriz de pesos aleatórios \mathbf{W}, por meio da resolução de um sistema linear. Para isso, o primeiro passo é determinar a matriz \mathbf{H} da seguinte maneira:

  \label{eq:matrizH}  \mathbf{H}^i = [x^i_1, \cdots, x^i_m, 1]  \begin{bmatrix}  w_{11}& \cdots & w_{1d} \\  \vdots & \ddots & \vdots \\  w_{m1}& \cdots & w_{md} \\  b_1 & \cdots & b_d  \end{bmatrix}  \Rightarrow  \mathbf{H} = \begin{bmatrix}  f(H^1)\\  f(H^2) \\  \vdots\\  f(H^N)  \end{bmatrix}_{N \times d}

onde a função f(.) é a função de transferência (pode ser uma sigmoid, por exemplo) da camada e i = \{1, \cdots, N\}, sendo N o número de amostras do conjunto de treinamento. Portanto, a matriz \mathbf{H} armazena o resultado de todos os neurônios da camada oculta obtidos a partir da multiplicação entre \mathbf{X} e \mathbf{W}. Uma vez determinada a matriz \mathbf{H}, para se obter os pesos da matriz \boldsymbol{\beta} deve ser solucionado o seguinte sistema linear:

  \label{eq:sistLinearELM}  \mathbf{H} \boldsymbol{\beta} = \mathbf{Y} \rightarrow \boldsymbol{\beta} = \mathbf{H}^\dagger \mathbf{Y}

onde \mathbf{H}^\dagger é a inversa generalizada de Moore–Penrose [3] da matriz \mathbf{H}. Caso fosse utilizado a inversa padrão, o algoritmos seria limitado a problemas que essa inversa existisse. A inversa generalizada ‘afrouxa’ algumas exigências da inversa tradicional, como por exemplo, a matriz não precisa ser quadrada. Para mais informações, consulte [3]. (Para quem usa Python+Numpy e/ou MATLAB, é o comando pinv())

Bom, realizado os passos acima a rede está treinada e pode ser executada. Observe, que devido ao fato do treinamento da ELM ser executado de forma analítica, o mesmo é realizado de maneira mais rápida do que um método iterativo [2]. Todavia a abordagem possui suas fraquezas. A primeira delas é relacionada a inicialização aleatória dos pesos da matriz \mathbf{W}. Pode ocorrer dos valores obtidos para \mathbf{W} desencadear, ao fim do processo, em uma matriz \boldsymbol{\beta} que proporcione um resultado final ruim. Por conta disso, existem trabalhos que visam otimizar a escolha dos valores de \mathbf{W} por meio de algoritmos evolutivos [4], por exemplo. Outra fraqueza é o fato do algoritmo trabalhar com a inversa generalizada da matriz \mathbf{H}. Caso a rede possua muitas amostras e muitos neurônios na camada oculta, obter a inversa generalizada de \mathbf{H} pode demandar bastante recurso computacional. Por fim, a rede realmente obtem bons resultados e pode ser milhares de vezes mais rápida do que uma rede neural tradicional. Você pode testar por conta própria utilizando o código disponibilizado na sequência, tanto em Python quanto em MATLAB.

Código ELM em python
Código ELM em MATLAB
Faça bom uso e até a próxima.

 

Referências

[1] Huang, G.-B.; Zhu, Q.-Y.; Siew, C.-K. Extreme learning machine: a new learning scheme of feedforward neural networks. IEEE International Joint Conference on Neural Networks, v. 2, p. 985–990, 2004.

[2] Huang, G.-B.; Zhu, Q.-Y.; Siew, C.-K. Extreme learning machine: theory and applications. Neurocomputing, v. 70, n. 1, p. 489–501, 2006.

[3] Serre, D. Matrices: theory and applications. New York: Springer, 2002.

[4] Han, F.; Yao, H.-F.; Ling, Q.-H. An improved evolutionary extreme learning machine based on particle swarm optimization. Neurocomputing, v. 116, p. 87–93, 2013.

Gostou? Então compartilhe!