[Python] Approssimazione con reti neurali
Salve a tutti!
Stavo guardando delle lezioni sul machine learning (https://www.video.uni-erlangen.de/clip/id/11034)
e uno degli esercizi proposti era la creazione di una rete neurale con un solo hidden layer (con un numero arbitrario di neuroni) che riesca ad approssimare un generico insieme convesso \(\displaystyle \Omega \)di \(\displaystyle \mathbb{R}^n \).
La mia idea era: divido l'insieme in \(\displaystyle N \) strati sottili. Ora prendo uno di questi strati e lo divido a sua volta in \(\displaystyle N \) strati sottili e così via fino ad ottenere \(\displaystyle N^n \) "linee" che compongono l'insieme, e so approssimare ognuna di queste linee con la giusta funzione step (o smoothstep se voglio che sia differenziabile ovunque, per qualche motivo).
Allora prendo un generico vettore \(\displaystyle x_{\text{in}}=(x_1,...,x_n) \) e associo ogni elemento dell'input layer ad \(\displaystyle N \) elementi dell'hidden layer, elementi che chiamo \(\displaystyle f_1,..,.f_{N^n} \). Con i giusti pesi e bias queste funzioni valgono 1 all'interno dell'insieme e 0 altrove. A questo punto, detta \(\displaystyle g \) un'altra funzione smoothstep, posso scrivere l'output come
\( \displaystyle x_{\text{out}}=g(w(\sum_{i=1}^{N^n}f_i-N^n+0.5) \)
Questa funzione ha la proprietà di essere positiva se e solo se tutte le funzioni valgono 1 e, per \(\displaystyle w \) sufficientemente grande, vale circa 1.
Questa è la mia proposta per una rete neurale che "disegna" un generico insieme convesso, ma temo di non essere in grado di implementarne il codice. (Sperando che questo post abbia il minimo senso) qualcuno ha idee?
Stavo guardando delle lezioni sul machine learning (https://www.video.uni-erlangen.de/clip/id/11034)
e uno degli esercizi proposti era la creazione di una rete neurale con un solo hidden layer (con un numero arbitrario di neuroni) che riesca ad approssimare un generico insieme convesso \(\displaystyle \Omega \)di \(\displaystyle \mathbb{R}^n \).
La mia idea era: divido l'insieme in \(\displaystyle N \) strati sottili. Ora prendo uno di questi strati e lo divido a sua volta in \(\displaystyle N \) strati sottili e così via fino ad ottenere \(\displaystyle N^n \) "linee" che compongono l'insieme, e so approssimare ognuna di queste linee con la giusta funzione step (o smoothstep se voglio che sia differenziabile ovunque, per qualche motivo).
Allora prendo un generico vettore \(\displaystyle x_{\text{in}}=(x_1,...,x_n) \) e associo ogni elemento dell'input layer ad \(\displaystyle N \) elementi dell'hidden layer, elementi che chiamo \(\displaystyle f_1,..,.f_{N^n} \). Con i giusti pesi e bias queste funzioni valgono 1 all'interno dell'insieme e 0 altrove. A questo punto, detta \(\displaystyle g \) un'altra funzione smoothstep, posso scrivere l'output come
\( \displaystyle x_{\text{out}}=g(w(\sum_{i=1}^{N^n}f_i-N^n+0.5) \)
Questa funzione ha la proprietà di essere positiva se e solo se tutte le funzioni valgono 1 e, per \(\displaystyle w \) sufficientemente grande, vale circa 1.
Questa è la mia proposta per una rete neurale che "disegna" un generico insieme convesso, ma temo di non essere in grado di implementarne il codice. (Sperando che questo post abbia il minimo senso) qualcuno ha idee?
Risposte
Non ho guardato il video e quindi non ho idea di quale sia la teoria spiegata esattamente. Tuttavia si può approssimare qualsiasi insieme convesso come intersezione di un numero arbitrario di semispazi. Puoi quindi pensare che ogni output del tuo hidden layer corrisponda ad uno di questi semispazi e che questi output vengano quindi "mischiati" con una funzione che rappresenti l'unione. Dal punto di vista delle formule puoi pensare ad ogni neurone fare una operazione come \(g( \omega \cdot x + \omega_0 )\) dove \(g\) è la funzione smoothstep e di calcolare poi il minimo di tutti questi valori. Qualcosa come il seguente insomma notando che il tuo hidden layer non è altro che una moltiplicazione matriciale e \(\operatorname{mincomp}\) calcola la componente minore del vettore.
\[ \operatorname{mincomp} g( W\,x + W_0) \]
\[ \operatorname{mincomp} g( W\,x + W_0) \]
"apatriarca":
Non ho guardato il video e quindi non ho idea di quale sia la teoria spiegata esattamente. Tuttavia si può approssimare qualsiasi insieme convesso come intersezione di un numero arbitrario di semispazi. Puoi quindi pensare che ogni output del tuo hidden layer corrisponda ad uno di questi semispazi e che questi output vengano quindi "mischiati" con una funzione che rappresenti l'unione. Dal punto di vista delle formule puoi pensare ad ogni neurone fare una operazione come \(g( \omega \cdot x + \omega_0 )\) dove \(g\) è la funzione smoothstep e di calcolare poi il minimo di tutti questi valori. Qualcosa come il seguente insomma notando che il tuo hidden layer non è altro che una moltiplicazione matriciale e \(\operatorname{mincomp}\) calcola la componente minore del vettore.
\[ \operatorname{mincomp} g( W\,x + W_0) \]
Gentilissimo! Avevo in mano la funzione che rappresenta l'unione e mi stavo arrovellando per capire se l'insieme fosse ben definito come "intersezione". E l'implementazione mi sembra chiara
