$o_j = \varphi \left( b_j + \sum_{i=1}^{n} w_{ij} x_i \right)$
$\varphi: \mathbb{R} \rightarrow \mathbb{R}$, souvent croissante (voire bornée)
Une fonction adaptée à un type de problème...
library(neuralnet)
vec_11 = rep(c(-1,1),each=5)
df = data.frame(x=vec_11, y=vec_11)
nn = neuralnet(y ~ ., df,
linear.output=TRUE, #pas de transformation en sortie
act.fct = function(x) x, #activation = identité
hidden=0) #...cf suite du cours :-)
= (très) Simple
régression linéaire
library(car)
nn = neuralnet(prestige ~ education+income+women, Prestige,
linear.output=TRUE, act.fct = function(x) x, hidden=0)
plot(nn)
On retrouve les résultats du cours 6 (fonction lm...)
Illustration sur un exemple simple, lui-même issu du livre "Réseaux neuronaux" de Jean-Philippe Rennard.
Objectif = reconnaître un motif précis sur un carré de 4 pixels noirs ou blancs.
Question : toujours convergence ?
Perceptron = (hyper)plan : au-dessus ou en dessous...
Exemple
softplus <- function(x) log(1 + exp(x))
nn <- neuralnet(
(Species == "setosa") ~ Petal.Length + Petal.Width,
iris, linear.output = FALSE,
hidden = c(3, 2), act.fct = softplus)
L'idée est d'évaluer l'impact d'une variation des poids sur l'erreur finale. Pour cela on calcule la dérivée de l'erreur en remontant petit à petit dans le réseau.
Voir la fin de cette présentation, et pour les calculs, la page Wikipedia par exemple.
> X = np.array([[0,0],[0,1],[1,0],[1,1]])
> y = np.array([0, 1, 1, 0])
> nn = neural_network.MLPClassifier(
hidden_layer_sizes=(3,), max_iter=2000)
> clf = nn.fit(X, y)
> clf.predict(X)
array([0, 0, 1, 0])
> nn = neural_network.MLPClassifier(
hidden_layer_sizes=(6,), max_iter=2000)
> clf = nn.fit(X, y)
> clf.predict(X)
array([0, 1, 1, 0])
# clf.coefs_
# clf.intercepts_
PPR : une seule couche cachée, addition en sortie (pas de transformation). Fonctions d'activations adaptées aux données.
MLP : $n$ couches cachées, transformation en sortie. Fonctions d'activations fixées.
$\rightarrow$ Ce dernier point permet plus de parallélisme dans l'apprentissage des MLP versus PPR (? à vérifier...)
Lisez cet article puis implémentez la méthode.
Essayez aussi de faire jouer cet algorithme contre ceux du TP "Chaînes de Markov".
Voir aussi l'aide scikit-learn et l'aide tensorflow.