After a few weeks down, laurent.sexy is up again :D
After a few weeks down, laurent.sexy is up again :D
This weekend I had an opportunity to mess around with an EEG reader at the brainhack event at biotech. I expected the signal to be easy to interpret but I can now tell that I was quite wrong.
Indeed, the signal is a mixture of a ton of electrical activity of the user's body with muscle being a strong source of noise. The signal is sampled at 250Hz, and feature extraction is usually done in fourier space.
It was difficult to control the signal's shape, but someone in the team managed to somewhat influence part of the signal by "thinking hard". A person would ask a bunch of question to that person such as arithmetics or asking what they ate yesterday, and some band would show higher activity.
However the signal's spectrum doesn't look like what was shown in other presentations about EEG, so maybe the device we used (which was a very experimental prototype) could be improved and allow future developpers to extract clearer signals.
The picture shows a live feed of the spectrum's amplitude squared streamed with OSC, and printed in my favourite way using the 4 shaded characters (I think we deserve a lightweight plotting tool for such realtime circumstances). Each band shows how a jaw movement influenced the signal.
Let's say you have two random variables $x_1,x_2 ∈ \{-1,1\}$ uniformly and independently distributed.
Now we apply a rotation $\ca{a_1 := x_1+x_2\\ a_2 := x_1-x_2 }$ and plot the corresponding distributions :
As you densify the distribution for $x_i ∈ \left\{\frac{-N}{N},\frac{-N+1}{N},\frac{-N+2}{N},...,\frac{N}{N}\right\}$ up to $ℝ$, it seems like you get a distribution with a lot of holes, in a funny spongy way. You could note that with the parity of $N$, the hole region gets "inverted".
But this observation is quite moronic : obviouly a grid of points is getting mapped to another grid of points. I'm the one drawing this with squares and creating the illusion of "new holes"... I think this is a good reminder of how a bad illustration can mislead intuition.
Today I met my neighboor who had his larynx removed, which means he can't speek normally. He has a passive tool to talk, but it hurts his skin, so he goes without speech, or write stuff down.
To my surprise he wasn't aware of electronic larynx. Back home I checked online and it was crazy expensive : the cheapest model of a thing that vibrate at a press of a button is ... 800CHF ??? This really doesn't seem reasonable (I don't know if there is a good reason for that, but that's hard to believe)
Here is my idea, you take :
- a talkbox (~100chf), or a piezo if it's powerful enough (~10chf)
- a micro-controller or an old smartphone to generate signal (~50chf)
- some haptic interface (gamepad, touchpad, analog trigger, or something) (~10chf)
- make an interface to control pitch and volume (here is a software prototype that requires a touchscreen)
Now you have a cheap electronic larynx with an extra cool feature : intonation.
I should be able to test that by only buying a talkbox, I already have a laptop and my touchscreen interface to test my cheap speech emulator.
Last weekend we made a short animated film using neural nets (it will be online soon). To be more specific, we used "prompt/image to image" models such as dall-e and stable diffusion. Those tools are very impressive, though yet quite unpredictable and hard to control finely. It already is awesome and it's on its way to be even more awesome.
However the ease at which it is possible to generate images is both cool and concerning.
The reason why this is cool is quite obvious : any unskilled dummy can generate pretty cool images at an incredible speed, for a negligible cost.
The reason I'm concerned is : no dataset, no AI. Thus paying the company who made the neural net while paying nothing to artists who made the major contribution in effort seems unfair.
What could happen if instead of $2$ beams, we use many many many$^{many^{many^{many^{many}}}}$ beams ?
I often thought of the fact that when you model some intelligent agents, when the agent is smart enough, it will contain itself a model of its environment. Then that model might recursively contain more models.
In our finite world, we know for sure that there is no way that a model contains a fully accurate representation of its environment (unless very good symmetries that simplifies everything). That aspect has always bothered me when people speak about market behavior. Often one states that agents are intelligent, but they are dumb enough to not act upon their internal model of what others do, while the person speaking about it clearly is trying to think ahead of those other agents : this implies that we are smarter than every other agents, which is a bad assumption.
I think this is even more important in human interactions in general regarding what to expect from others, and being careful on what people think and mean during an exchange.
skull is a board game that is exactly about that. Everyone is trying to guess what other players are about play (who themselves are doing the same thing).
hanabi is a cooperative game where means of communication are very restricted. So you have to decide what information to share considering what you think other players will guess you intended them to deduce. (you can't even tell other players that you need information, they need to figure who will get information, which itself is information)
They are both great, yet very simple games that I strongly recommend.
Maybe there is an even simpler game that lets players observe this "modeling issue". Let's assume this game : each player has to pick a number. The number that is the closest to the average of all picked numbers wins. The interesting thing is that your play is about the other players plays. You have to decide what people around are likely to say, while they also will adapt to what they think you are likely to say.
To avoid convergence, every player that have guessed a number that have been guessed by another player loses.
picking a very large number is not a winning strategy.
I was testing different activation function to figure what features let the activation perform well. I knew that we should
- prevent vanishing gradient (the derivative should not go down to $0$ too easily which will prevent the learning)
- prevent exploding gradient (the derivative should not grow too crazily)
- expand the accessible function space (to leave linear function space)
But there are many more things that could be considered.
What about periodic function ? with varying oscillation frequency ?
hard to predict function (such as cellular automaton result, or chaotic physics experiment) ?
purposely falsified gradient ?
horror function (cantor function and other fractals) ?
smooth noise function (perlin, use a photo or a recording as a function) ?
noised function (activation is a random variable) ?
fourier domain, taylor expansion terms, or other well known transform ?
parametric analytic functions (such as $∑_{i,j}x_i^{x_j}$ and variant that "selects some terms etc...") ?
My intuition was that the function should be "hard to predict" so that it contains a lot of information to be used as a support for compression, but also not too complex (like pure noise) as I feel that we should be able to somewhat parametrize in a nice way, at least for the gradient to be computable.
Here are some ideas I should explore.
I empirically found that using $\sin$ as an activation function, I often get pretty good results. And when we think about it, it looks a bit like "working in fourier space" in a not very clear manner...
A very natural way to represent oscillations is complex numbers with complex exponential, plus a lot of physics is made simpler using complex numbers (when they are not simply required like in quantum stuff) mainly because it contains both the oscillation behavior and the growth behavior.
It is quite obvious that the activation function doesn't need to be $ℝ→ℝ$. Instead of picking any n-dimentional activation (which may still be interesting), we could consider that given a set of famous activation function that we don't know how to pick, we make a new activation that takes the usual input parameter but also some other input(s) to choose between activations
We could make a neural net on top of a neural net that tries to find the best set of activation functions.
The idea is simple, yet horrible in term of computation. We make a neural net with parameters as usual, plus parameters in the activation function. The process of "initialize and train the neural net and compute the final loss" is the process to optimize for the activation function (the second neural net on top of it that in turns optimize the activation parameters)
An interesting aspect of Fourier transform is that it can be computed at the speed of light with optics
I should develop why this holds and to which limits
This might be a broader question : when we look at a signal and it's fourier transform, it is quite easy to spot which is which. The case that would make this unclear would be a gaussian function.
Sometimes it is easier to process a signal in fourier space, and sometime it is easier in the original space. Conceptually, if we were to write a process that would optimize a neural net to work in fourier space, and then in original space multiple time, we would want to have an even number of fourier transforms. But if we have a deep enough model, does the parity really affects a lot the processing ? Will it keep a strong separation between original space and fourier space ?
The gradient is a very localized variation indicator. When we do the descent, sometimes it's better to know "where in general we shall go" to avoid local minima. Optimizers with impulsion help with that, maybe we could do something similar by purposely lying on the value of the gradient. An example could be that we evaluate ReLU but compute the derivative of the convlution of ReLU with a gaussian. Though it is not clear if that helps on the final loss "smoothness"
What happens if we use sigmoid, but add 1 to the derivative ? Half of the time it would help correct back to $0$, but it would also push some parameters to grow for no actual gain. Maybe combined with some regularization it could be useful...
Roger Tootell did an experiment where he trained a monkey to watch a blinking target while keeping its head at a constant position.
When the monkey was good enough at this task, he made it do that thing again while injecting some radioactive components that would stick to active neurons (something that the active neurons would try to "eat") and then... kill the monkey. Then he sliced it's brain and found the exact image printed in that radioactive component.
A very interesting observation we can make is how the image is deforme : the center part that is quite small is blown up to be the same size as the surrounding part of the image. It makes a lot of sens that where our attention is, we use more neurons.
That gives the obvious idea : we could make a parametric layer that does that "zoom in" (or rather shrink crap) which could help with 2 things
1. drop ressources in a smarter way
2. make it possible to understand where the neural net puts its focus on
The implementation of such thing would be quite straightforward using inverse rendering techniques such as these implementations
Iteratively refine a model by adding new operators behaving like identity, and progressively amplify non-linearity.
The neural net is seen as a computing graph that grows, following compatibility rules. Each elements of the graph can be of the list
- operator $ℝ^m → ℝ^n$
like linear, convolution, fourier, maxpool, activations ...
or regulizers such as layernorm, batchnorm, dropout, noise generator...
- internal state storage (RNN)
Add natural selection to the previous idea where each generation will choose random additions and make random mixtures privileging best performing models.
I once found a quite cool paper that suggested to look at neural networks as a discretization of a continous phenomenon. I followed a numerical analysis course where the main idea was iterative refining, so maybe that could allow to start with a coarse neural net, and refine it as it performs better. This is yet very blury and sci-fi but maybe there is a way to make the refinment process choose a good architecture instead of building something by hands.
a PDE of order $1$ for $u:ℝ^n→ℝ$ can be interpreted as a function $F(x,u(x),∇u(x))=0$
$F(x,u(x),∇u(x))=0$ can also be seen as a hypersurface on the space of $(x,u,∇u)≈ℝ^{2n+1}$ called 1-jet space.
Then a solution is a part of that surface so that $(x,u(x),∇u(x))$
are really a function and not a bunch of non sensical coordinates
⋅ decrease along $x_1$ with slope $-1$,
⋅ increase along $x_2$ with slope $+1$,
⋅ stay still along $x_3$ and $x_4$.
Otherwise the selection of points on the surface is not drawing a function.
It happens that using this approach, we can transform a PDE to an ODE (a PDE with only one variable).
This is cool because those ODE can be seen as "a particle within the PDE", or "the propagation of information".
Here is a cool illustration from the full post, hopefully it will make sense after you read it.
James Franklin Campbell (blanc) et Alan Ehrlich (noir) jouaient une partie d'échecs postales.
En même temps d'avoir avancé son pion en G6, noir annonce que quelque soit le coup de blanc, il mettra son fou en G7.
Quel coup blanc va-t-il jouer ?
Vendredi dernier j'ai essayé un retrograde chess sur la proposition de Cyrille. En voici quelques uns.
T. R. Dawson, The Chess Amateur, 1927 : Il faut arriver à ceci sachant que blanc a joué le dernier coup
Smullyan : en exactement 4 coups pour chaque joueurs, comment arrive-t-on dans cette configuration ?
Smullyan : Le roi blanc a été retiré du plateau. Où était il ? Quels ont été les deux derniers coups ?
Un immeuble 2D vu de côté est occupé par des visiteurs. Il y a un ascenseur par extrémité du bâtiment, donc ascenseurs.
Le visiteurs sont un peu bizarre. Ils ont chacun une séquence (cyclique) d'étages à parcourir. Un visiteur à gauche prendra l'ascenseur à gauche pour aller à l'étage suivant de sa liste. Une fois arrivé il traversera l'étage pour reprendre l'ascenseur de l'autre côté (à droite ici) pour aller visiter l'étage suivant de la liste et ainsi de suite.
Mais le building n'est pas stable. Tant qu'il y a autant de visiteur d'un côté que de l'autre, tout va bien, mais en cas de déséquilibre, passé un ratio critique, le côté plus lourd s'effondre.
Le but est évidemment d'envoyer le maximum de visiteur de l'autre côté, plus vite qu'on en reçoit.
La configuration initiale est complètement symétrique :
- les ascenseurs sont au même étage (disons étage 0)
- chaque visiteur droite a un clone à gauche qui a exactement la même liste cyclique d'étages à parcourir.
- Pas d'aléatoire dans le comportement des visiteurs. Seule la liste à parcourir est générée au début, puis reste figée.
- On ne peut pas identifier les visiteurs.
- La liste par visiteur est privée, seul l'étage souhaité pour le trajet courant est visible.
- Un ascenseur ne sait rien de ce qui se passe de l'autre côté.
- 8 places par ascenseur. En cas de manque de place, les visiteurs entrent dans l'ordre d'attente.
Le comportement des visiteurs :
- la liste des étages à visiter est de longueur 3
- un visiteur dans un ascenseur ne descendra que lorsque l'ascenseur s'arrête à son étage
- dès que l'ascenseur arrive, le visiteur monte, indépendamment de l'intention de l'ascenseur.
- un visiteur en attente annonce directement l'étage qu'il veut visiter à l'ascenseur (le panel de boutons est le même que dans l'ascenseur, avec tous les étages sélectionnables.)
Modèle de temps :
- monter/descendre un étage : 1 tick
- ouvrir les portes, faire entrer et sortir les visiteurs, puis fermer les portes : 1 tick
- les visiteurs prennent 2 ticks pour traverser l'immeuble. Au tick 1 ils passent de la sortie de l'ascenseur, au milieu de l'immeuble. Au tick 2 ils arrivent de l'autre côté. Ils pourront monter dans l'ascenseur au tick suivant.
- dans un premier temps, les ticks sont considérés gigantesques, de telle sorte que l'IA peut passer beaucoup de temps à choisir un étage sans conséquence.
L'écroulement a lieu si un côté a plus de $90\%$ des visiteurs (alternativement $\max(50,100-λ⋅t)\%$ des visiteurs, où $λ$ contrôle la pression du temps)
Poussin tycoon 2017 est une plateforme vidéo ludique de réalité parallèle. Contrairement à la réalité virtuelle, la réalité parallèle utilise un environement physique comme support de jeu, ce qui assure un rendu réaliste : aberation chromatique, indirect illumination, fluides, self colliding fur, précision à l'échelle moléculaire, support up to 480p.
Poussin tycoon 2017 est "PG - absolutely non vegan rated"
Le concept est le suivant. Un poussin chou est rangé dans une cage. Une caméra pointe dans la cage et stream l'image vers le joueur. Le joueur a une liste d'actions possibles :
- donner une goutter de truc à boire
- donner une miette de truc à manger
- nettoyer la cage
- reset le poussin (ie jeter le poussin et en mettre un neuf)
Ces actions sont payantes : les utilisateurs doivent regarder de la pub pour assurer la survie de l'animal.
Le concept vous intéresse ? Contactez les développeurs ici pour qu'il puissent réaliser "human baby tycoon 2018"
Je vous recommande de mettre ceci dans votre /etc/motd
_______ __ __ ______ _______ ______
| \_/ |_____] |______ |_____/
|_____ | |_____] |______ | \_
Y. _
YiL .```.
Yii; .; .;;`.
YY;ii._ .;`.;;;; :
iiYYYYYYiiiii;;;;i` ;;::;;;;
_.;YYYYYYiiiiiiYYYii .;;. ;;;
.YYYYYYYYYYiiYYYYYYYYYYYYii;` ;;;;
.YYYYYYY$$YYiiYY$$$$iiiYYYYYY;.ii;`..
:YYY$!. TYiiYY$$$$$YYYYYYYiiYYYYiYYii.
Y$MM$: :YYYYYY$!"``"4YYYYYiiiYYYYiiYY.
`. :MM$$b.,dYY$$Yii" :' :YYYYllYiiYYYiYY
_.._ :`4MM$!YYYYYYYYYii,.__.diii$$YYYYYYYYYYY
.,._ $b`P` "4$$$$$iiiiiiii$$$$YY$$$$$$YiY;
`,.`$: :$$$$$$$$$YYYYY$$$$$$$$$YYiiYYL
"`;$$. .;PPb$`.,.``T$$YY$$$$YYYYYYiiiYYU:
;$P$;;: ;;;;i$y$"!Y$$$b;$$$Y$YY$$YYYiiiYYiYY
$Fi$$ .. ``:iii.`-":YYYYY$$YY$$$$$YYYiiYiYYY
:Y$$rb ```` `_..;;i;YYY$YY$$$$$$$YYYYYYYiYY:
:$$$$$i;;iiiiidYYYYYYYYYY$$$$$$YYYYYYYiiYYYY.
`$$$$$$$YYYYYYYYYYYYY$$$$$$YYYYYYYYiiiYYYYYY
.i!$$$$$$YYYYYYYYY$$$$$$YYY$$YYiiiiiiYYYYYYY
:YYiii$$$$$$$YYYYYYY$$$$YY$$$$YYiiiiiYYYYYYi'
_______ _____ _______ _____ _ _ _______ _______ ______
| | | | | | |_____] | | | |______ |_____/
|_____ |_____| | | | | |_____| | |______ | \_
font made with this website (cyberlarge)
ascii art by this dude
Je me suis fait scanner mon oeil, j'ai demandé les données. Maintenant j'ai ça.
J'ai utilisé ce truc pour générer la normal map à partir de la depthmap, par feignéantise.
Le 27 octobre 2014, des mecs ont ramené cette machine à la gnu. Ils avaient envoyé un mail avec.
Über fondue la plus über de tout Lausanne avec l'invité numéro 14 en tissus et en plastique pour éviter d'être 13 !
Jonathan s'est ramené avec une méga courge de chez lui ! On a fait la soupe v2 avec des patates, des carottes, un peu de sel, du poivre, un morceau de gruyere, et on a fait un méga gros pain avec... clairement pas assez de sel. Mais on avait la soupe alors ça allait !
La courge était énorme, il nous restait pas mal de soupe alors on a fait un deuxième service le lendemain à la GNU. J'ai fait chauffer la soupe dans le bâtiment des mthématiciens avec Axel A., je me suis brûlé et un professeur a commenté comme quoi la soupe était chouette puis il est parti. On a fait profiter Florian V., Axel A., moi et Guillaume M. du deuxième service avec du gruyere et du fromage M-budget : on a découvert qu'il ne faut pas acheter ce deuxième fromage.
Je voulais avoir toutes les couleurs en même temps sur chaque faces du rubik's cube sans qu'aucune couleur adjacente soit la même.
De gauche à droite :
- 6 couleurs par face, aucune couleur adjacente identique.
- 4 couleurs par face, aucune couleur adjacente identique.
- 1 couleur par face, parfum chocolat.
Avec Pierre C., nous avons accordé la turbine en exposition à l'epfl ! Il est maintenant possible de jouer de la turbine, un instrument qui a une tessiture qui s'étend sur une octave...
la full version, mais seules ces quelques mesures sont vraiment bien à mon goût.
berret baguette.
Sushis expérimentaux avec du saumon, crevettes, concombre, œuf, avocat, kakis, poivron, cervelas, jambon cru, bacon, etc... Suivi d'un flan vanille ! J'ai raté le riz.
Florian s'est ramené à la maison avec une courge qu'il a gagné à une lotterie en échangeant un billet perdant contre un billet gagnant. On a fait une soupe avec la courge, des patates et des carottes, un peu de sel, poivre, gruyere, sauce soja et tabasco, puis on a tout reversé dans la courge creusée juste pour la forme.
J'ai fait la nuit des musées à Lausanne, j'ai pu voir au musée bolo le blue gene en marche ! Ils ont fait tourner un hello world dessus. Il y avait aussi plein de vieux macs, diverses implémentations de pong, et des démos de commodore64/atari/etc sur de gros vieux écrans cathodiques - certains en noir et blanc.
Puis j'ai visité une expo nommée "chaud latin" sur la sexualité des romains.
Et finalement je suis allé à la Riponne voir une expo de BDs, une expo d'archéo sur les anciennes monnaies et une expo sur des tableaux Russes.
Aujourd'hui j'ai exploré le marché de morges, et j'ai essayé ça : Old Jamaica. Grosso modo, ça a le même goût que le Ginger Ale, mais en cent fois plus fort.
Ceci est le tout premier article que je poste sur mon site enfin accessible en ligne ! Je suis entrain d'apprendre HTML, CSS et JavaScript pour vous faire un site pas trop moche !