Réseaux de neurones et apprentissage profond, Chapitre 4: Preuve visuelle que les réseaux de neurones peuvent calculer n'importe quelle fonction

Dans ce chapitre, je donne une explication simple et surtout visuelle du thĂ©orĂšme de l'universalitĂ©. Pour suivre le contenu de ce chapitre, il n'est pas nĂ©cessaire de lire les prĂ©cĂ©dents. Il est structurĂ© comme un essai indĂ©pendant. Si vous avez la comprĂ©hension la plus Ă©lĂ©mentaire de NS, vous devriez ĂȘtre capable de comprendre les explications.


L'un des faits les plus étonnants sur les réseaux de neurones est qu'ils peuvent calculer n'importe quelle fonction. Autrement dit, supposons que quelqu'un vous donne une sorte de fonction complexe et sinueuse f (x):



Et quelle que soit cette fonction, il est garanti un réseau de neurones tel que pour toute entrée x la valeur f (x) (ou une approximation proche) sera la sortie de ce réseau, c'est-à-dire:



Cela fonctionne mĂȘme si c'est une fonction de nombreuses variables f = f (x 1 , ..., x m ), et avec de nombreuses valeurs. Par exemple, voici un rĂ©seau calculant une fonction avec m = 3 entrĂ©es et n = 2 sorties:



Ce résultat suggÚre que les réseaux de neurones ont une certaine universalité. Quelle que soit la fonction que nous voulons calculer, nous savons qu'il existe un réseau neuronal qui peut le faire.

De plus, le thĂ©orĂšme d'universalitĂ© tient mĂȘme si nous limitons le rĂ©seau Ă  une seule couche entre les neurones entrants et sortants - ce qu'on appelle dans une couche cachĂ©e. Ainsi, mĂȘme les rĂ©seaux avec une architecture trĂšs simple peuvent ĂȘtre extrĂȘmement puissants.

Le thĂ©orĂšme de l'universalitĂ© est bien connu des personnes utilisant des rĂ©seaux de neurones. Mais bien qu'il en soit ainsi, la comprĂ©hension de ce fait n'est pas si rĂ©pandue. Et la plupart des explications Ă  cela sont trop complexes sur le plan technique. Par exemple, l' un des premiers articles prouvant ce rĂ©sultat a utilisĂ© le thĂ©orĂšme de Hahn-Banach , le thĂ©orĂšme de reprĂ©sentation de Riesz et une analyse de Fourier. Si vous ĂȘtes mathĂ©maticien, il est facile pour vous de comprendre ces preuves, mais pour la plupart des gens, ce n'est pas si facile. C’est dommage, car les raisons fondamentales de l’universalitĂ© sont simples et belles.

Dans ce chapitre, je donne une explication simple et surtout visuelle du théorÚme de l'universalité. Nous allons parcourir pas à pas les idées qui le sous-tendent. Vous comprendrez pourquoi les réseaux de neurones peuvent vraiment calculer n'importe quelle fonction. Vous comprendrez certaines des limites de ce résultat. Et vous comprendrez comment le résultat est associé à une NS profonde.

Pour suivre le contenu de ce chapitre, il n'est pas nĂ©cessaire de lire les prĂ©cĂ©dents. Il est structurĂ© comme un essai indĂ©pendant. Si vous avez la comprĂ©hension la plus Ă©lĂ©mentaire de NS, vous devriez ĂȘtre capable de comprendre les explications. Mais je fournirai parfois des liens vers des documents prĂ©cĂ©dents pour aider Ă  combler les lacunes dans les connaissances.

Les thĂ©orĂšmes d'universalitĂ© se trouvent souvent en informatique, alors parfois nous oublions mĂȘme Ă  quel point ils sont incroyables. Mais cela vaut la peine de vous le rappeler: la capacitĂ© de calculer n'importe quelle fonction arbitraire est vraiment incroyable. Presque tous les processus que vous pouvez imaginer peuvent ĂȘtre rĂ©duits au calcul d'une fonction. ConsidĂ©rez la tĂąche de trouver le nom d'une composition musicale sur la base d'un bref passage. Cela peut ĂȘtre considĂ©rĂ© comme un calcul de fonction. Ou considĂ©rez la tĂąche de traduire un texte chinois en anglais. Et cela peut ĂȘtre considĂ©rĂ© comme un calcul de fonction (en fait, de nombreuses fonctions, car il existe de nombreuses options acceptables pour traduire un seul texte). Ou considĂ©rez la tĂąche de gĂ©nĂ©rer une description de l'intrigue du film et de la qualitĂ© du jeu sur la base du fichier mp4. Cela aussi peut ĂȘtre considĂ©rĂ© comme le calcul d'une certaine fonction (la remarque faite sur les options de traduction de texte est Ă©galement correcte ici). L'universalitĂ© signifie qu'en principe, les SN peuvent effectuer toutes ces tĂąches et bien d'autres.

Bien sĂ»r, seulement du fait que nous savons qu'il existe des NS capables de traduire, par exemple, du chinois vers l'anglais, il ne s'ensuit pas que nous ayons de bonnes techniques pour crĂ©er ou mĂȘme reconnaĂźtre un tel rĂ©seau. Cette restriction s'applique Ă©galement aux thĂ©orĂšmes d'universalitĂ© traditionnels pour les modĂšles tels que les schĂ©mas boolĂ©ens. Mais, comme nous l'avons dĂ©jĂ  vu dans ce livre, le NS dispose de puissants algorithmes d'apprentissage des fonctions. La combinaison d'algorithmes d'apprentissage et de polyvalence est un mĂ©lange attrayant. Jusqu'Ă  prĂ©sent, dans le livre, nous nous sommes concentrĂ©s sur les algorithmes de formation. Dans ce chapitre, nous nous concentrerons sur la polyvalence et ce que cela signifie.

Deux astuces


Avant d'expliquer pourquoi le théorÚme d'universalité est vrai, je veux mentionner deux astuces contenues dans l'énoncé informel «un réseau de neurones peut calculer n'importe quelle fonction».

PremiĂšrement, cela ne signifie pas que le rĂ©seau peut ĂȘtre utilisĂ© pour calculer avec prĂ©cision n'importe quelle fonction. Nous pouvons obtenir une approximation aussi bonne que nĂ©cessaire. En augmentant le nombre de neurones cachĂ©s, nous amĂ©liorons l'approximation. Par exemple, j'ai prĂ©cĂ©demment illustrĂ© un rĂ©seau calculant une certaine fonction f (x) en utilisant trois neurones cachĂ©s. Pour la plupart des fonctions, en utilisant trois neurones, seule une approximation de faible qualitĂ© peut ĂȘtre obtenue. En augmentant le nombre de neurones cachĂ©s (disons, jusqu'Ă  cinq), nous pouvons gĂ©nĂ©ralement obtenir une meilleure approximation:



Et pour améliorer la situation en augmentant encore le nombre de neurones cachés.

Pour clarifier cette affirmation, disons qu'on nous a donnĂ© une fonction f (x), que nous voulons calculer avec une certaine prĂ©cision nĂ©cessaire Δ> 0. Il est garanti qu'en utilisant un nombre suffisant de neurones cachĂ©s, nous pouvons toujours trouver un NS dont la sortie g (x) satisfait l'Ă©quation | g (x) −f (x) | <Δ pour tout x. En d'autres termes, l'approximation sera rĂ©alisĂ©e avec la prĂ©cision souhaitĂ©e pour toute valeur d'entrĂ©e possible.

Le deuxiĂšme problĂšme est que les fonctions qui peuvent ĂȘtre approximĂ©es par la mĂ©thode dĂ©crite appartiennent Ă  une classe continue. Si la fonction est interrompue, c'est-Ă -dire qu'elle fait des sauts brusques et soudains, alors dans le cas gĂ©nĂ©ral, il sera impossible de se rapprocher Ă  l'aide de NS. Et cela n'est pas surprenant, car nos NS calculent les fonctions continues des donnĂ©es d'entrĂ©e. Cependant, mĂȘme si la fonction que nous devons vraiment calculer est discontinue, l'approximation est souvent assez continue. Si oui, alors nous pouvons utiliser NS. En pratique, cette limitation n'est gĂ©nĂ©ralement pas importante.

En consĂ©quence, une dĂ©claration plus prĂ©cise du thĂ©orĂšme d'universalitĂ© sera que NS avec une couche cachĂ©e peut ĂȘtre utilisĂ©e pour approximer n'importe quelle fonction continue avec la prĂ©cision souhaitĂ©e. Dans ce chapitre, nous prouvons une version lĂ©gĂšrement moins rigoureuse de ce thĂ©orĂšme, utilisant deux couches cachĂ©es au lieu d'une. Dans les tĂąches, je dĂ©crirai briĂšvement comment cette explication peut ĂȘtre adaptĂ©e, avec des modifications mineures, Ă  une preuve qui utilise une seule couche cachĂ©e.

Polyvalence avec une entrée et une valeur de sortie


Pour comprendre pourquoi le théorÚme d'universalité est vrai, nous commençons par comprendre comment créer une fonction d'approximation NS avec une seule entrée et une seule valeur de sortie:



Il s'avĂšre que c'est l'essence mĂȘme de la tĂąche d'universalitĂ©. Une fois que nous aurons compris ce cas particulier, il sera assez facile de l'Ă©tendre Ă  des fonctions avec de nombreuses valeurs d'entrĂ©e et de sortie.

Pour comprendre comment construire un réseau pour compter f, nous commençons avec un réseau contenant une seule couche cachée avec deux neurones cachés, et avec une couche de sortie contenant un neurone de sortie:



Pour imaginer comment fonctionnent les composants du réseau, nous nous concentrons sur le neurone supérieur caché. Dans le diagramme de l' article d'origine, vous pouvez modifier le poids de maniÚre interactive avec la souris en cliquant sur «w» et voir immédiatement comment la fonction calculée par le neurone supérieur caché change:



Comme nous l'avons appris plus tĂŽt dans le livre, un neurone cachĂ© compte σ (wx + b), oĂč σ (z) ≡ 1 / (1 + e −z ) est un sigmoĂŻde . Jusqu'Ă  prĂ©sent, nous avons utilisĂ© cette forme algĂ©brique assez souvent. Cependant, pour prouver l'universalitĂ©, il serait prĂ©fĂ©rable d'ignorer complĂštement cette algĂšbre et de manipuler et d'observer la forme sur le graphique. Cela vous aidera non seulement Ă  mieux ressentir ce qui se passe, mais nous donnera Ă©galement une preuve d'universalitĂ© applicable Ă  d'autres fonctions d'activation en plus de sigmoĂŻde.

À strictement parler, l'approche visuelle que j'ai choisie n'est traditionnellement pas considĂ©rĂ©e comme une preuve. Mais je crois que l'approche visuelle fournit plus de perspicacitĂ© dans la vĂ©ritĂ© du rĂ©sultat final que la preuve traditionnelle. Et, bien sĂ»r, une telle comprĂ©hension est le vĂ©ritable objectif de la preuve. Dans les preuves que je propose, des lacunes se prĂ©senteront parfois; Je fournirai des preuves visuelles raisonnables, mais pas toujours rigoureuses. Si cela vous dĂ©range, considĂ©rez qu'il est de votre devoir de combler ces lacunes. Cependant, ne perdons pas de vue l'objectif principal: comprendre pourquoi le thĂ©orĂšme de l'universalitĂ© est vrai.

Pour commencer avec cette épreuve, cliquez sur le décalage b dans le diagramme d'origine et faites glisser vers la droite pour l'agrandir. Vous verrez qu'avec une augmentation du décalage, le graphique se déplace vers la gauche, mais ne change pas de forme.

Faites-le ensuite glisser vers la gauche pour réduire le décalage. Vous verrez que le graphique se déplace vers la droite sans changer de forme.

RĂ©duisez le poids Ă  2-3. Vous verrez qu'Ă  mesure que le poids diminue, la courbe se redresse. Pour que la courbe ne s'Ă©chappe pas du graphique, vous devrez peut-ĂȘtre corriger le dĂ©calage.

Enfin, augmentez le poids à des valeurs supérieures à 100. La courbe deviendra plus raide et finira par s'approcher de l'étape. Essayez d'ajuster le décalage de sorte que son angle soit dans la région du point x = 0,3. La vidéo ci-dessous montre ce qui devrait arriver:



Nous pouvons grandement simplifier notre analyse en augmentant le poids afin que la sortie soit vraiment une bonne approximation de la fonction de pas. Ci-dessous, j'ai construit la sortie du neurone caché supérieur pour le poids w = 999. Ceci est une image statique:



L'utilisation des fonctions pas à pas est un peu plus facile qu'avec un sigmoïde typique. La raison en est que les contributions de tous les neurones cachés sont additionnées dans la couche de sortie. La somme d'un ensemble de fonctions pas à pas est facile à analyser, mais il est plus difficile de parler de ce qui se passe lorsqu'un groupe de courbes est ajouté en tant que sigmoïde. Par conséquent, il sera beaucoup plus simple de supposer que nos neurones cachés produisent des fonctions pas à pas. Plus précisément, nous le faisons en fixant le poids w à une valeur trÚs élevée, puis en affectant la position du pas à travers le décalage. Bien sûr, travailler avec une sortie en tant que fonction pas à pas est une approximation, mais c'est trÚs bien, et jusqu'à présent, nous traiterons la fonction comme une vraie fonction pas à pas. Plus tard, je reviendrai sur la discussion de l'effet des écarts par rapport à cette approximation.

Quelle valeur de x est le pas? En d'autres termes, comment la position de la marche dépend-elle du poids et du déplacement?

Pour répondre à la question, essayez de modifier le poids et le décalage dans le graphique interactif. Pouvez-vous comprendre comment la position de l'étape dépend de w et b? En pratiquant un peu, vous pouvez vous convaincre que sa position est proportionnelle à b et inversement proportionnelle à w.

En fait, le pas est Ă  s = ​​−b / w, comme on le verra si on ajuste le poids et le dĂ©placement aux valeurs suivantes:



Notre vie sera grandement simplifiĂ©e si nous dĂ©crivons des neurones cachĂ©s avec un seul paramĂštre, s, c'est-Ă -dire par la position du pas, s = −b / w. Dans le diagramme interactif suivant, vous pouvez simplement modifier s:



Comme indiquĂ© ci-dessus, nous avons spĂ©cialement attribuĂ© un poids w Ă  l'entrĂ©e Ă  une trĂšs grande valeur - suffisamment grande pour que la fonction de pas devienne une bonne approximation. Et nous pouvons facilement ramener le neurone paramĂ©trĂ© de cette maniĂšre Ă  sa forme habituelle en choisissant le biais b = −ws.

Jusqu'à présent, nous nous sommes concentrés sur la sortie du seul neurone caché supérieur. Examinons le comportement de l'ensemble du réseau. Supposons que les neurones cachés calculent les fonctions de pas définies par les paramÚtres des pas s 1 (neurone supérieur) et s 2 (neurone inférieur). Leurs poids de sortie respectifs sont w 1 et w 2 . Voici notre réseau:



À droite, un graphique de la sortie pondĂ©rĂ©e w 1 a 1 + w 2 a 2 de la couche cachĂ©e. Ici, a 1 et a 2 sont respectivement les sorties des neurones cachĂ©s supĂ©rieur et infĂ©rieur. Ils sont dĂ©signĂ©s par «a», car ils sont souvent appelĂ©s activations neuronales.

Soit dit en passant, nous notons que la sortie de l'ensemble du rĂ©seau est σ (w 1 a 1 + w 2 a 2 + b), oĂč b est le biais du neurone de sortie. Ce n'est Ă©videmment pas la mĂȘme chose que la sortie pondĂ©rĂ©e de la couche cachĂ©e, dont nous construisons le graphique. Mais pour l'instant, nous nous concentrerons sur la sortie Ă©quilibrĂ©e de la couche cachĂ©e et ne penserons que plus tard Ă  la façon dont elle se rapporte Ă  la sortie de l'ensemble du rĂ©seau.

Essayez d'augmenter et de diminuer l'étape s 1 du neurone supérieur caché sur le diagramme interactif dans l'article d'origine . Découvrez comment cela modifie la sortie pondérée du calque masqué. Il est particuliÚrement utile de comprendre ce qui se passe lorsque s 1 dépasse s 2 . Vous verrez que le graphique dans ces cas change de forme, lorsque nous passons d'une situation dans laquelle le neurone caché supérieur est activé en premier à une situation dans laquelle le neurone caché inférieur est activé en premier.

De mĂȘme, essayez de manipuler le pas s 2 du neurone cachĂ© infĂ©rieur et voyez comment cela modifie la sortie globale des neurones cachĂ©s.

Essayez de réduire et d'augmenter les poids de sortie. Remarquez comment cela modifie la contribution des neurones cachés correspondants. Que se passe-t-il si l'un des poids est égal à 0?

Enfin, essayez de régler w 1 à 0,8 et w 2 à -0,8. Le résultat est une fonction de «saillie», avec un début à s 1 , une fin à s 2 et une hauteur de 0,8. Par exemple, une sortie pondérée pourrait ressembler à ceci:



Bien sĂ»r, la saillie peut ĂȘtre mise Ă  l'Ă©chelle Ă  n'importe quelle hauteur. Utilisons un paramĂštre, h, indiquant la hauteur. Aussi, pour simplifier, je vais me dĂ©barrasser des notations "s 1 = ..." et "w 1 = ...".



Essayez d'augmenter et de diminuer la valeur h pour voir comment la hauteur de la saillie change. Essayez de rendre h négatif. Essayez de modifier les points des étapes pour observer comment cela modifie la forme de la saillie.

Vous verrez que nous utilisons nos neurones non seulement comme des primitives graphiques, mais aussi comme des unités plus familiÚres aux programmeurs - quelque chose comme une instruction si-alors-autre dans la programmation:

si entrée> = début de l'étape:
ajouter 1 à la sortie pondérée
sinon:
ajouter 0 à la sortie pondérée

Pour la plupart, je m'en tiendrai à la notation graphique. Cependant, il vous sera parfois utile de passer à la vue si-alors-autre et de réfléchir à ce qui se passe en ces termes.

Nous pouvons utiliser notre astuce de protrusion en collant deux parties de neurones cachĂ©s ensemble sur le mĂȘme rĂ©seau:



Ici, j'ai baissé les poids en écrivant simplement les valeurs h pour chaque paire de neurones cachés. Essayez de jouer avec les deux valeurs h et voyez comment cela change le graphique. Déplacez les onglets, en changeant les points des étapes.

Dans un cas plus gĂ©nĂ©ral, cette idĂ©e peut ĂȘtre utilisĂ©e pour obtenir un nombre souhaitĂ© de pics de n'importe quelle hauteur. En particulier, nous pouvons diviser l'intervalle [0,1] en un grand nombre de (N) sous-intervalles, et utiliser N paires de neurones cachĂ©s pour obtenir des pics de n'importe quelle hauteur souhaitĂ©e. Voyons comment cela fonctionne pour N = 5. C'est dĂ©jĂ  beaucoup de neurones, donc je suis une prĂ©sentation un peu plus Ă©troite. DĂ©solĂ© pour le diagramme complexe - j'ai pu cacher la complexitĂ© derriĂšre des abstractions supplĂ©mentaires, mais il me semble que cela vaut la peine d'ĂȘtre tourmentĂ© par la complexitĂ© afin de mieux ressentir le fonctionnement des rĂ©seaux de neurones.



Vous voyez, nous avons cinq paires de neurones cachés. Les points des pas des paires correspondantes sont situés à 0,1 / 5, puis 1 / 5,2 / 5, et ainsi de suite, jusqu'à 4 / 5,5 / 5. Ces valeurs sont fixes - nous obtenons cinq protubérances de largeur égale sur le graphique.

Chaque paire de neurones a une valeur h qui lui est associĂ©e. N'oubliez pas que les connexions des neurones de sortie ont des poids h et –h. Dans l'article d'origine du graphique, vous pouvez cliquer sur les valeurs h et les dĂ©placer de gauche Ă  droite. Avec un changement de hauteur, l'horaire change Ă©galement. En modifiant les poids de sortie, nous construisons la fonction finale!

Sur le diagramme, vous pouvez toujours cliquer sur le graphique et faire glisser la hauteur des marches vers le haut ou vers le bas. Lorsque vous modifiez sa hauteur, vous voyez comment la hauteur du h correspondant change. Les poids de sortie + h et –h changent en consĂ©quence. En d'autres termes, nous manipulons directement une fonction dont le graphique est affichĂ© Ă  droite et voyons ces changements dans les valeurs de h Ă  gauche. Vous pouvez Ă©galement maintenir le bouton de la souris enfoncĂ© sur l'une des saillies, puis faire glisser la souris vers la gauche ou la droite, et les saillies s'ajusteront Ă  la hauteur actuelle.

Il est temps de faire le travail.

Rappelez-vous la fonction que j'ai dessinée au tout début du chapitre:



Ensuite, je n'ai pas mentionné cela, mais en fait, cela ressemble à ceci:

f(x)=0,2+0,4x2+0,3x sjen(15x)+0,05 cos(50x) tung113



Il est construit pour x valeurs de 0 Ă  1, et les valeurs le long de l'axe y varient de 0 Ă  1.

De toute évidence, cette fonction n'est pas triviale. Et vous devez comprendre comment le calculer en utilisant des réseaux de neurones.

Dans nos rĂ©seaux de neurones ci-dessus, nous avons analysĂ© une combinaison pondĂ©rĂ©e ∑ j w j a j de sortie de neurones cachĂ©s. Nous savons comment contrĂŽler significativement cette valeur. Mais, comme je l'ai notĂ© prĂ©cĂ©demment, cette valeur n'est pas Ă©gale Ă  la sortie rĂ©seau. La sortie du rĂ©seau est σ (∑ j w j a j + b), oĂč b est le dĂ©placement du neurone de sortie. Pouvons-nous prendre le contrĂŽle directement sur la sortie du rĂ©seau?

La solution consiste Ă  dĂ©velopper un rĂ©seau neuronal dans lequel la sortie pondĂ©rĂ©e de la couche cachĂ©e est donnĂ©e par l'Ă©quation σ −1 ⋅f (x), oĂč σ −1 est la fonction inverse de σ. Autrement dit, nous voulons que la sortie pondĂ©rĂ©e de la couche cachĂ©e soit la suivante:



Si cela réussit, alors la sortie de l'ensemble du réseau sera une bonne approximation de f (x) (j'ai réglé le décalage du neurone de sortie sur 0).

Ensuite, votre tùche consiste à développer une NS approximative de la fonction objectif indiquée ci-dessus. Pour mieux comprendre ce qui se passe, je vous recommande de résoudre ce problÚme deux fois. Pour la premiÚre fois dans l' article original, cliquez sur le graphique et ajustez directement les hauteurs des différentes saillies. Il vous sera assez facile d'obtenir une bonne approximation de la fonction objectif. Le degré d'approximation est estimé par l'écart moyen, la différence entre la fonction objectif et la fonction que le réseau calcule. Votre tùche consiste à ramener l'écart moyen à une valeur minimale. La tùche est considérée comme terminée lorsque l'écart moyen ne dépasse pas 0,40.



AprÚs avoir réussi, appuyez sur le bouton Réinitialiser, qui modifie les onglets de maniÚre aléatoire. La deuxiÚme fois, ne touchez pas le graphique, mais modifiez les valeurs h sur le cÎté gauche du diagramme, en essayant de ramener l'écart moyen à une valeur de 0,40 ou moins.

Et donc, vous avez trouvé tous les éléments nécessaires au réseau pour calculer approximativement la fonction f (x)! L'approximation s'est avérée grossiÚre, mais nous pouvons facilement améliorer le résultat en augmentant simplement le nombre de paires de neurones cachés, ce qui augmentera le nombre de protubérances.

En particulier, il est facile de reconvertir toutes les données trouvées dans la vue standard avec le paramétrage utilisé pour NS. Permettez-moi de vous rappeler rapidement comment cela fonctionne.

Dans la premiĂšre couche, tous les poids ont une grande valeur constante, par exemple, w = 1000.

Les dĂ©placements des neurones cachĂ©s sont calculĂ©s par b = −ws. Ainsi, par exemple, pour le deuxiĂšme neurone cachĂ©, s = 0,2 se transforme en b = −1000 × 0,2 = −200.

La derniÚre couche de l'échelle est déterminée par les valeurs de h. Ainsi, par exemple, la valeur que vous choisissez pour le premier h, h = -0,2, signifie que les poids de sortie des deux neurones supérieurs cachés sont respectivement -0,2 et 0,2. Et ainsi de suite, pour toute la couche de poids de sortie.

Enfin, le décalage du neurone de sortie est 0.

Et c'est tout: nous avons une description complÚte du NS, qui calcule bien la fonction objectif initiale. Et nous comprenons comment améliorer la qualité de l'approximation en améliorant le nombre de neurones cachés.

De plus, dans notre fonction objectif d'origine f (x) = 0,2 + 0,4x 2+ 0.3sin (15x) + 0.05cos (50x) n'a rien de spĂ©cial. Une procĂ©dure similaire pourrait ĂȘtre utilisĂ©e pour toute fonction continue sur les intervalles de [0,1] Ă  [0,1]. En fait, nous utilisons notre NS Ă  couche unique pour construire une table de recherche pour une fonction. Et nous pouvons prendre cette idĂ©e comme base pour obtenir une preuve gĂ©nĂ©ralisĂ©e d'universalitĂ©.

Fonction de nombreux paramĂštres


Nous Ă©tendons nos rĂ©sultats au cas d'un ensemble de variables d'entrĂ©e. Cela semble compliquĂ©, mais toutes les idĂ©es dont nous avons besoin peuvent dĂ©jĂ  ĂȘtre comprises pour le cas avec seulement deux variables entrantes. Par consĂ©quent, nous considĂ©rons le cas avec deux variables entrantes.

Commençons par regarder ce qui se passe quand un neurone a deux entrées:



Nous avons les entrées x et y, avec les poids correspondants w 1 et w 2 et le décalage b du neurone. Définissez le poids de w 2 sur 0 et jouez avec le premier, w 1 et le décalage b pour voir comment ils affectent la sortie du neurone:



Comme vous pouvez le voir, avec w 2 = 0, l'entrée y n'affecte pas la sortie du neurone. Tout se passe comme si x était la seule entrée.

Compte tenu de cela, que pensez-vous qu'il se passera lorsque nous augmenterons le poids de w 1 à w 1 = 100 et que w 2 laissera 0? Si cela ne vous est pas immédiatement clair, réfléchissez un peu à cette question. Regardez ensuite la vidéo suivante, qui montre ce qui va se passer:



Comme prĂ©cĂ©demment, avec une augmentation du poids d'entrĂ©e, la sortie se rapproche de la forme de l'Ă©tape. La diffĂ©rence est que notre fonction pas Ă  pas est maintenant situĂ©e en trois dimensions. Comme prĂ©cĂ©demment, nous pouvons dĂ©placer l'emplacement des Ă©tapes en modifiant le dĂ©calage. L'angle sera au point s x ≡ - b / w1.

Reprenons le diagramme pour que le paramÚtre soit l'emplacement de l'étape:



Nous supposons que le poids d'entrée de x est d'une grande importance - j'ai utilisé w 1 = 1000 - et le poids w 2 = 0. Le nombre sur le neurone est la position du pas, et le x au-dessus nous rappelle que nous déplaçons le pas le long de l'axe x. Naturellement, il est tout à fait possible d'obtenir une fonction de pas le long de l'axe y, ce qui rend le poids entrant pour y grand (par exemple, w 2= 1000), et le poids pour x est 0, w 1 = 0:



Le nombre sur le neurone, encore une fois, indique la position du pas, et y au-dessus nous rappelle que nous déplaçons le pas le long de l'axe y. Je pourrais directement désigner les poids pour x et y, mais je ne l'ai pas fait, car cela jetterait le graphique. Mais gardez à l'esprit que le marqueur y indique que le poids pour y est grand et pour x est 0.

Nous pouvons utiliser les fonctions de pas que nous venons de concevoir pour calculer la fonction de saillie tridimensionnelle. Pour ce faire, nous prenons deux neurones, chacun calculant une fonction de pas le long de l'axe x. Ensuite, nous combinons ces fonctions de pas avec les poids h et –h, oĂč h est la hauteur de saillie souhaitĂ©e. Tout cela peut ĂȘtre vu dans le diagramme suivant:



Essayez de modifier la valeur de h. Voyez comment cela se rapporte aux poids du réseau. Et comment elle modifie la hauteur de la fonction de saillie à droite.

Essayez également de modifier le point de l'étape, dont la valeur est définie sur 0,30 dans le neurone supérieur caché. Voyez comment cela change la forme de la saillie. Que se passe-t-il si vous le déplacez au-delà du point 0,70 associé au neurone caché inférieur?

Nous avons appris à construire la fonction de protrusion le long de l'axe x. Naturellement, nous pouvons facilement faire la fonction de saillie le long de l'axe y, en utilisant deux fonctions de pas le long de l'axe y. Rappelons que nous pouvons le faire en faisant de grands poids à l'entrée y et en réglant le poids 0 à l'entrée x. Et alors, que se passe-t-il:



Il semble presque identique au réseau précédent! Le seul changement visible est de petits marqueurs y sur les neurones cachés. Ils nous rappellent qu'ils produisent des fonctions pas à pas pour y, et non pour x, donc le poids à l'entrée y est trÚs grand, et à l'entrée x il est nul, et non l'inverse. Comme précédemment, j'ai décidé de ne pas le montrer directement, afin de ne pas encombrer l'image.

Voyons ce qui se passe si nous ajoutons deux fonctions de protrusion, l'une le long de l'axe x, l'autre le long de l'axe y, toutes deux de hauteur h:



Pour simplifier le schéma de connexion avec un poids nul, j'ai omis. Jusqu'à présent, j'ai laissé de petits marqueurs x et y sur les neurones cachés pour me rappeler dans quelles directions les fonctions de protrusion sont calculées. Plus tard, nous les refuserons, car ils sont impliqués par la variable entrante.

Essayez de changer le paramĂštre h. Comme vous pouvez le voir, pour cette raison, les poids de sortie changent, ainsi que les poids des deux fonctions de saillie, x et y.

Notre



création est un peu comme une «fonction tour»: si nous pouvons créer de telles fonctions tour, nous pouvons les utiliser pour approximer des fonctions arbitraires en ajoutant simplement des tours de différentes hauteurs à différents endroits:



bien sûr, nous n'avons pas encore atteint la création d'une fonction tour arbitraire. Jusqu'à présent, nous avons construit quelque chose comme une tour centrale de hauteur 2h avec un plateau de hauteur h qui l'entoure.

Mais nous pouvons faire fonctionner une tour. Rappelons que nous avons prĂ©cĂ©demment montrĂ© comment les neurones peuvent ĂȘtre utilisĂ©s pour implĂ©menter l'instruction if-then-else:

if  >= :  1 else:  0 

C'était un neurone à une entrée. Et nous devons appliquer une idée similaire à la sortie combinée des neurones cachés:

  if     >= :  1 else:  0 

Si nous choisissons le bon seuil - par exemple, 3h / 2, coincé entre la hauteur du plateau et la hauteur de la tour centrale - nous pouvons écraser le plateau à zéro et ne laisser qu'une seule tour.

Imaginez comment faire cela? Essayez d'expĂ©rimenter avec le rĂ©seau suivant. Maintenant, nous traçons la sortie de l'ensemble du rĂ©seau, et pas seulement la sortie pondĂ©rĂ©e de la couche cachĂ©e. Cela signifie que nous ajoutons le terme de dĂ©calage Ă  la sortie pondĂ©rĂ©e de la couche cachĂ©e et appliquons le sigmoĂŻde. Pouvez-vous trouver les valeurs de h et b pour lesquelles vous obtenez une tour? Si vous ĂȘtes bloquĂ© Ă  ce stade, voici deux conseils: (1) pour que le neurone sortant dĂ©montre le comportement correct dans le style if-then-else, nous avons besoin que les poids entrants (tous h ou –h) soient grands; (2) la valeur de b dĂ©termine l'Ă©chelle du seuil si-alors-sinon.



Avec les paramĂštres par dĂ©faut, la sortie est similaire Ă  une version aplatie du diagramme prĂ©cĂ©dent, avec une tour et un plateau. Pour obtenir le comportement souhaitĂ©, vous devez augmenter la valeur de h. Cela nous donnera le comportement de seuil de if-then-else. DeuxiĂšmement, pour fixer correctement le seuil, il faut choisir b ≈ −3h / 2.

Voici Ă  quoi cela ressemble pour h = 10:


MĂȘme pour des valeurs relativement modestes de h, nous obtenons une belle fonction de tour. Et, bien sĂ»r, nous pouvons obtenir un rĂ©sultat arbitrairement beau en augmentant encore h et en maintenant le biais au niveau b = −3h / 2.

Essayons de coller deux réseaux ensemble pour compter deux fonctions de tour différentes. Pour clarifier les rÎles respectifs des deux sous-réseaux, je les mets dans des rectangles séparés: chacun d'eux calcule la fonction tour en utilisant la technique décrite ci-dessus. Le graphique de droite montre la sortie pondérée de la deuxiÚme couche cachée, c'est-à-dire la combinaison pondérée des fonctions de la tour.



En particulier, on peut voir qu'en changeant le poids dans la derniĂšre couche, vous pouvez changer la hauteur des tours de sortie.

La mĂȘme idĂ©e vous permet de calculer autant de tours que vous le souhaitez. Nous pouvons les rendre arbitrairement minces et hauts. Par consĂ©quent, nous garantissons que la sortie pondĂ©rĂ©e de la deuxiĂšme couche cachĂ©e se rapproche de toute fonction souhaitĂ©e de deux variables:



En particulier, en faisant bien approcher la sortie pondĂ©rĂ©e de la deuxiĂšme couche cachĂ©e σ −1 hiddenf, nous garantissons que la sortie de notre rĂ©seau sera une bonne approximation de la fonction f souhaitĂ©e.

Qu'en est-il des fonctions de nombreuses variables?

Essayons de prendre trois variables, x 1 , x 2 , x 3 . Le rĂ©seau suivant peut-il ĂȘtre utilisĂ© pour calculer la fonction de la tour en quatre dimensions?



Ici x 1 , x 2 , x 3 dĂ©signent l'entrĂ©e rĂ©seau. s 1 , t 1, et ainsi de suite - les points de pas pour les neurones - c'est-Ă -dire que tous les poids dans la premiĂšre couche sont grands, et les dĂ©calages sont assignĂ©s de sorte que les points de pas soient s 1 , t 1 , s 2 , ... Les poids dans la deuxiĂšme couche alternent, + h, −h, oĂč h est un trĂšs grand nombre. Le dĂ©calage de sortie est de -5h / 2.

Le réseau calcule une fonction égale à 1 dans trois conditions: x 1 est compris entre s 1 et t 1 ; x 2 est compris entre s 2 et t 2 ; x 3 est compris entre s 3 et t 3 . Le réseau est 0 dans tous les autres endroits. Il s'agit d'une tour dans laquelle 1 est une petite partie de l'espace d'entrée et 0 est tout le reste.

En collant un grand nombre de ces rĂ©seaux, nous pouvons obtenir autant de tours que nous le souhaitons et approcher une fonction arbitraire de trois variables. La mĂȘme idĂ©e fonctionne en m dimensions. Seul le dĂ©calage de sortie (−m + 1/2) h est modifiĂ© pour comprimer correctement les valeurs souhaitĂ©es et supprimer le plateau.

Eh bien, maintenant nous savons comment utiliser NS pour approximer la fonction rĂ©elle de nombreuses variables. Qu'en est-il des fonctions vectorielles f (x 1 , ..., x m ) ∈ R n ? Bien entendu, une telle fonction peut ĂȘtre considĂ©rĂ©e simplement comme n fonctions rĂ©elles distinctes f1 (x 1 , ..., x m ), f2 (x 1 , ..., x m ), etc. Et puis nous collons juste tous les rĂ©seaux ensemble. Il est donc facile de le comprendre.

Défi


  • Nous avons vu comment utiliser des rĂ©seaux de neurones avec deux couches cachĂ©es pour approximer une fonction arbitraire. Pouvez-vous prouver que cela est possible avec une seule couche cachĂ©e? Astuce - essayez de travailler avec seulement deux variables de sortie et montrez que: (a) il est possible d'obtenir les fonctions des Ă©tapes non seulement le long des axes x ou y, mais aussi dans une direction arbitraire; (b) en additionnant de nombreuses constructions de l'Ă©tape (a), il est possible d'approcher la fonction d'une tour ronde plutĂŽt que rectangulaire; © Ă  l'aide de tours rondes, il est possible d'approximer une fonction arbitraire. L'Ă©tape © sera plus facile Ă  rĂ©aliser en utilisant le matĂ©riel prĂ©sentĂ© dans ce chapitre un peu plus bas.

Aller au-delĂ  des neurones sigmoĂŻdes


Nous avons prouvĂ© qu'un rĂ©seau de neurones sigmoĂŻdes peut calculer n'importe quelle fonction. Rappelons que dans un neurone sigmoĂŻde, les entrĂ©es x 1 , x 2 , ... se transforment Ă  la sortie en σ (∑ j w j x j j + b), oĂč w j sont les poids, b est le dĂ©placement, σ est le sigmoĂŻde.



Et si nous regardons un autre type de neurone utilisant une fonction d'activation différente, s (z):



Autrement dit, nous supposons que si un neurone a x 1 , x 2 , ... les poids w 1 , w 2 , ... et le biais b à l'entrée, alors la sortie aura s ( j j w j x j j + b).

On peut utiliser cette fonction d'activation pour se faire marcher, tout comme dans le cas du sigmoĂŻde. Essayez (dans l' article d'origine ) sur le diagramme de soulever le poids pour, disons, w = 100:





Comme dans le cas du sigmoĂŻde, de ce fait, la fonction d'activation est compressĂ©e et, par consĂ©quent, se transforme en une trĂšs bonne approximation de la fonction de pas. Essayez de changer le dĂ©calage, et vous verrez que nous pouvons changer l'emplacement de l'Ă©tape Ă  n'importe quel. Par consĂ©quent, nous pouvons utiliser toutes les mĂȘmes astuces qu'auparavant pour calculer n'importe quelle fonction souhaitĂ©e.

Quelles propriĂ©tĂ©s doit avoir s (z) pour que cela fonctionne? Nous devons supposer que s (z) est bien dĂ©fini comme z → −∞ et z → ∞. Ces limites sont deux valeurs acceptĂ©es par notre fonction pas Ă  pas. Nous devons Ă©galement supposer que ces limites sont diffĂ©rentes. S'ils ne diffĂ©raient pas, les Ă©tapes ne fonctionneraient pas; il y aurait simplement un horaire fixe! Mais si la fonction d'activation s (z) satisfait Ă  ces propriĂ©tĂ©s, les neurones basĂ©s sur celle-ci sont universellement adaptĂ©s aux calculs.

Les tĂąches


  • Plus tĂŽt dans le livre, nous avons rencontrĂ© un type diffĂ©rent de neurone - un neurone linĂ©aire redressĂ© ou une unitĂ© linĂ©aire rectifiĂ©e, ReLU. Expliquez pourquoi ces neurones ne remplissent pas les conditions nĂ©cessaires Ă  l'universalitĂ©. Trouvez des preuves de polyvalence montrant que les ReLU sont universellement adaptĂ©s Ă  l'informatique.
  • Supposons que nous considĂ©rons des neurones linĂ©aires, avec la fonction d'activation s (z) = z. Expliquez pourquoi les neurones linĂ©aires ne satisfont pas aux conditions d'universalitĂ©. Montrez que ces neurones ne peuvent pas ĂȘtre utilisĂ©s pour l'informatique universelle.

Fonction étape fixe


Pour le moment, nous avons supposĂ© que nos neurones produisent des fonctions de pas prĂ©cises. C'est une bonne approximation, mais seulement une approximation. En fait, il existe un Ă©troit intervalle d'Ă©chec, illustrĂ© dans le graphique suivant, oĂč les fonctions ne se comportent pas du tout comme une fonction pas Ă  pas:



En cette période d'échec, mon explication de l'universalité ne fonctionne pas.

L'Ă©chec n'est pas si effrayant. En fixant des poids d'entrĂ©e suffisamment grands, nous pouvons rendre ces Ă©carts arbitrairement petits. Nous pouvons les rendre beaucoup plus petits que sur la carte, invisibles Ă  l'Ɠil nu. Alors peut-ĂȘtre que nous n'avons pas Ă  nous soucier de ce problĂšme.

Néanmoins, j'aimerais avoir un moyen de le résoudre.

Il s'avĂšre que c'est facile Ă  rĂ©soudre. Voyons cette solution pour calculer les fonctions NS avec une seule entrĂ©e et une seule sortie. Les mĂȘmes idĂ©es fonctionneront pour rĂ©soudre le problĂšme avec un grand nombre d'entrĂ©es et de sorties.

Supposons en particulier que nous voulons que notre rĂ©seau calcule une fonction f. Comme prĂ©cĂ©demment, nous essayons de le faire en concevant le rĂ©seau de sorte que la sortie pondĂ©rĂ©e de la couche cachĂ©e de neurones soit σ −1 ⋅f (x):



Si nous le faisons en utilisant la technique décrite ci-dessus, nous forcerons les neurones cachés à produire une séquence de fonctions de protrusion:



Bien sĂ»r, j'ai exagĂ©rĂ© la taille des intervalles d'Ă©chec, pour que ce soit plus facile Ă  voir. Il devrait ĂȘtre clair que si nous additionnons toutes ces fonctions des protubĂ©rances, nous obtenons une assez bonne approximation de σ −1 ⋅f (x) partout sauf pour les intervalles de dĂ©faillance.

Mais, supposons qu'au lieu d'utiliser l'approximation qui vient d'ĂȘtre dĂ©crite, nous utilisons un ensemble de neurones cachĂ©s pour calculer l'approximation de la moitiĂ© de notre fonction objective d'origine, c'est-Ă -dire σ −1 ⋅f (x) / 2. Bien sĂ»r, cela ressemblera Ă  une version Ă  l'Ă©chelle du dernier graphique:



Et, supposons que nous faisons un autre ensemble de neurones cachĂ©s calculer l'approximation de σ −1 −f (x) / 2, cependant, Ă  sa base, les protubĂ©rances seront dĂ©calĂ©es de la moitiĂ© de leur largeur:



Nous avons maintenant deux approximations diffĂ©rentes pour σ - 1⋅f (x) / 2. Si nous additionnons ces deux approximations, nous obtenons une approximation gĂ©nĂ©rale de σ - 1⋅f (x). Cette approximation gĂ©nĂ©rale comportera toujours des inexactitudes Ă  petits intervalles. Mais le problĂšme sera moindre qu'auparavant - car les points tombant dans les intervalles de l'Ă©chec de la premiĂšre approximation ne tomberont pas dans les intervalles de l'Ă©chec de la seconde approximation. Par consĂ©quent, l'approximation de ces intervalles sera environ 2 fois meilleure.

Nous pouvons amĂ©liorer la situation en ajoutant un grand nombre, M, d'approximations qui se chevauchent de la fonction σ - 1⋅f (x) / M. Si tous leurs intervalles de dĂ©faillance sont suffisamment Ă©troits, aucun courant ne sera dans l'un d'eux. Si vous utilisez un nombre suffisamment grand d'approximations de M qui se chevauchent, le rĂ©sultat est une excellente approximation gĂ©nĂ©rale.

Conclusion


L'explication de l'universalitĂ© discutĂ©e ici ne peut certainement pas ĂȘtre appelĂ©e une description pratique de la façon de compter les fonctions Ă  l'aide de rĂ©seaux de neurones! En ce sens, cela ressemble plus Ă  une preuve de la polyvalence des portes logiques NAND et plus encore. Par consĂ©quent, j'ai essentiellement essayĂ© de rendre ce design clair et facile Ă  suivre sans optimiser ses dĂ©tails. Cependant, essayer d'optimiser cette conception peut ĂȘtre un exercice intĂ©ressant et instructif pour vous.

Bien que le rĂ©sultat obtenu ne puisse pas ĂȘtre directement utilisĂ© pour crĂ©er NS, il est important car il supprime la question de la calculabilitĂ© d'une fonction particuliĂšre utilisant NS. La rĂ©ponse Ă  une telle question sera toujours positive. Par consĂ©quent, il est correct de demander si une fonction est calculable, mais quelle est la bonne façon de la calculer.

Notre conception universelle utilise seulement deux couches cachĂ©es pour calculer une fonction arbitraire. Comme nous l'avons vu, il est possible d'obtenir le mĂȘme rĂ©sultat avec une seule couche cachĂ©e. Compte tenu de cela, vous vous demandez peut-ĂȘtre pourquoi nous avons besoin de rĂ©seaux profonds, c'est-Ă -dire des rĂ©seaux avec un grand nombre de couches cachĂ©es. Ne pouvons-nous pas simplement remplacer ces rĂ©seaux par des rĂ©seaux peu profonds qui ont une couche cachĂ©e?

Bien que, en principe, cela soit possible, il existe de bonnes raisons pratiques d'utiliser des réseaux de neurones profonds. Comme décrit dans le chapitre 1, les NS profonds ont une structure hiérarchique qui leur permet de bien s'adapter pour étudier les connaissances hiérarchiques, qui sont utiles pour résoudre des problÚmes réels. Plus précisément, lors de la résolution de problÚmes tels que la reconnaissance de formes, il est utile d'utiliser un systÚme qui comprend non seulement des pixels individuels, mais aussi des concepts de plus en plus complexes: des bordures aux formes géométriques simples, et au-delà, aux scÚnes complexes impliquant plusieurs objets. Dans les chapitres suivants, nous verrons des preuves en faveur du fait que les SN profonds seront mieux en mesure de faire face à l'étude de telles hiérarchies de connaissances que les NS peu profondes. Pour résumer: l'universalité nous dit que NS peut calculer n'importe quelle fonction; des données empiriques suggÚrent que les NS profonds sont mieux adaptés à l'étude des fonctions utiles pour résoudre de nombreux problÚmes du monde réel.

Source: https://habr.com/ru/post/fr461659/


All Articles