10.14 Redes Neurais Artificiais
There is nothing particularly magical about multilayer neural networks; they implement linear discriminants, but in a space where the inputs have been mapped nonlinearly. (Duda, Hart, and Stork 2001, 283)
(McCulloch and Pitts 1943) admitem o tratamento da atividade do sistema neurofisiológico através da lógica proposicional. (Rosenblatt 1958) desenvolve uma teoria para um sistema nervoso hipotético, ou modelo cerebral (brain model), chamado de perceptron. O perceptron é projetado para ilustrar algumas das propriedades fundamentais dos sistemas inteligentes em geral, sem se tornar profundamente enredado nas condições especiais e frequentemente desconhecidas que são válidas para organismos biológicos específicos. (Rosenblatt 1962) indica que por ‘modelo cerebral’ entende-se qualquer sistema teórico que tenta explicar o funcionamento psicológico de um cérebro em termos de leis conhecidas da física e matemática, e fatos conhecidos da neuroanatomia e fisiologia.
(Rumelhart, Hinton, and Williams 1985) apresentam uma generalização do perceptron para estimar os coeficientes para redes arbitrárias. A regra, chamada regra delta generalizada (generalized delta rule), implementa um método de gradiente descendente para encontrar pesos que minimizam a soma do erro ao quadrado. Note que neste artigo a representação das redes é feita de baixo para cima. Esta representação se expande à medida que aumenta o número de camadas, dando a caracerística do aprendizado conhecido como profundo (deep). Redes com muitos neurônios por sua vez deixam a representação larga (wide), em uma terminologia pouco difundida.
(Cybenko 1989) e (Hornik, Stinchcombe, and White 1989) discutem diferentes abordagens para o Teorema da Aproximação Universal. Este teorema e seus corolários apontam que combinações lineares finitas de composições de funções fixas e univariadas e conjuntos de funções afins podem se aproximar uniformemente de qualquer função contínua de \(n\) variáveis reais, utilizando condições moderadas impostas à função univariada. Em particular, mostra-se que regiões de decisão arbitrárias podem ser aproximadas por redes neurais contínuas feedforward com apenas uma única camada interna oculta e qualquer não linearidade sigmoidal contínua.
Enquanto as Florestas Aleatórias e Boosting tem bom desempenho em reconhecimento de imagens, as redes neurais apresentam boa acurácia para reconhecimento em áudio vídeo. É importante lembrar que existem alguns pontos em aberto na metodologia de redes neurais, tal como a questão de identificabiidade discutida por (Goodfellow, Bengio, and Courville 2016) (8.2.2 Local Minima pp. 283-285) e (Pourzanjani, Jiang, and Petzold 2017)
10.14.2 Backpropagation
The back-propagation method was actually found in 1963 for solving some control problems (Bryson Jr, Denham, and Dreyfus 1963) and was rediscovered for perceptrons. (Vapnik 1995, 11)
O método de backpropagation (retropropagação) é, em suma, a regra da cadeia utilizado para estimar os pesos e vieses da rede. Para tal considera-se a linearidade do gradiente, i.e., \[\nabla/(f+g) = \nabla/(f)+\nabla/(g)\] Seja \(\theta\) o conjunto de todos os pesos e vieses da rede neural, tal que \(i=1,\ldots,n\), \(L_i(\theta)=(y_i - \Psi_{\theta}(x_i))^2 \Rightarrow L(\theta)=\sum_{i=1}^n L_i(\theta)\). O método online learning estima \(\theta\) iterativamente tal que \[\theta^{(t+1)}=\theta^{t}-\delta \nabla/L_i(\theta^{t}) \Rightarrow \nabla/L(\theta)=\sum_{i=1}^n \nabla/L_i(\theta)\]
(Hinton 2022) propõe o algoritmo Forward-Forward, um procedimento de aprendizado multicamada ganancioso inspirado nas máquinas de Boltzmann (Hinton and Sejnowski, 1986) e na Estimação Contrastante de Ruído (Gutmann and Hyvärinen, 2010). A ideia é substituir os passos para frente e para trás da retropropagação por dois passos para frente que operam exatamente da mesma maneira, mas em dados diferentes e com objetivos opostos.
10.14.4 Keras e TensorFlow
(Allaire and Chollet 2021) apresentam Keras, uma API de redes neurais. Tem os seguintes recursos principais:
- Permite que o mesmo código seja executado na CPU ou GPU.
- API que facilita a criação de protótipos de modelos de aprendizado profundo.
- Suporte integrado para redes convolucionais (para visão computacional), redes recorrentes (para processamento de sequência) e qualquer combinação de ambas.
- Suporta arquiteturas de rede arbitrárias: modelos de múltiplas entradas ou saídas, compartilhamento de camadas, compartilhamento de modelos, etc.
Backpropagation no TensorFlow/Keras - Gradiente estocástico
Embaralhar os dados de treino.
Pegar ‘mini lotes’ (mini batches), e.g. 32.
Fazer backpropagation para cada lote \(l = 1,\ldots,L\), \(\theta^{t+1} = \theta^{t} - \delta \sum_{i \in \text{lote}} \nabla/L_i (\theta^{t})\).
(1-2-3) formam uma época (epoch). Repetir, e.g., 10x.
Exercício 10.9 onsidere os links a seguir.
a. https://tensorflow.rstudio.com/reference/keras/install_keras/.
b. https://software.intel.com/content/www/us/en/develop/articles/intel-optimization-for-tensorflow-installation-guide.html.
c. https://www.tensorflow.org/install/source#macos_1.
d. https://github.com/bazelbuild/bazelisk.
e.https://stackoverflow.com/questions/22424142/error-your-local-changes-to-the-following-files-would-be-overwritten-by-checkou.
f. https://www.youtube.com/watch?v=CHJzoFArI8c.
g. http://playground.tensorflow.org.
h. ?generics::fit
.
i. ?keras::fit.keras.engine.training.Model
.
j. ?keras::compile
.
# devtools::install_github('rstudio/keras')
# keras::install_keras()
# reticulate::py_config()
# reticulate::py_module_available('keras')
# devtools::install_github('rstudio/reticulate')
# install.packages('tensorflow')
# tensorflow::install_tensorflow(version = '2.6.0-cpu')
Exemplo 10.31 Classificando espécies de lírio via redes neurais. Lembre de sempre padronizar os dados! (?scale
)
# amostra de treino: 60%
set.seed(1); itrain <- sort(sample(1:nrow(iris), floor(.6*nrow(iris))))
train <- iris[itrain,]
test <- iris[-itrain,]
# padronizando/normalizando
train[-5] <- scale(train[-5])
test[-5] <- scale(test[-5])
# modelo
# library(keras)
# fit.nn <- keras_model_sequential()
# fit.nn
# fit.nn <- layer_dense(fit.nn, units = 2^4, activation = 'relu', input_shape = 4)
# fit.nn
# fit.nn <- layer_dense(fit.nn, units = 2^3, activation = 'relu')
# fit.nn
# fit.nn <- layer_dense(fit.nn, units = 2^2, activation = 'relu')
# fit.nn <- layer_dense(fit.nn, units = 2^0, activation = 'relu')
# fit.nn
# compile(fit.nn, loss = 'mse',
# optimizer = 'adam',
# metrics = 'mse')
# ini <- Sys.time()
# history <- fit(fit.nn, train[-5], train$Species,
# batch_size = 2^3, epochs = 10,
# validation_split = .2)
# Sys.time()-ini