quarta-feira, 13 de agosto de 2014

TOY implementation of vacuum cleaner cenario

This simple TOY implementation of vacuum cleaner cenario (AIMA section 2.1 ed 4th) using less than 500 Javascript lines.
I'm not an skilled javascript programmer (thanks w3scholls!) but the TOY implementation try to show how is possible build simple AI assets using JavaScript WITHOUT advanced tooling as Fuzzy logic, Bayesians nets, A* searches and so on. No pre-knowledge is given so the cleaner need to learn based only in itself perceptions and actions, and just uses a primitive learning mechanism, based rudimentary comparation and recompense, to reach best performance along your life with no generalization. Of course, this primitive process converge slowly =)


http://23.21.215.215/vacuumcleanertoy/

I apologize for any browser specific issues. Any troubles, please gimme feedback: doleron at gmail.com

Enjoy.

quinta-feira, 3 de abril de 2014

Sigmoid Function, Derivative and Limits

We have two objectives. First, we need derivate the sigmoid function:

$S(x) = \frac {1}{1 + e^{-px}}$

using very simple techniques.

Second, we must to find the more right and more left function limits:

$ \lim_{x \to +\infty }{S(x)} = 1$ e $\lim_{x \to -\infty }{S(x)} = 0$ 

Derivative sigmoid

We are looking for

$\frac{\mathrm{d} S(x)}{\mathrm{d} x} = S'(x)$.

To deriving it, we'll apply the quocient rule, which is remembered here:

$\left ( \frac{f}{g} \right )' = \frac{f'g  -  g'f}{g^2}$

Said that, taking:

$f(x) = 1 \Rightarrow f'(x) = 0$
and
$g(x) = 1 + e^{-px} \Rightarrow g'(x) = -pe^{-px}$

Then,

$S'(x) = \left ( \frac{f}{g} \right )' = \frac{0g - g'1}{g^2} = \frac{pe^{-px}}{(1  +  e^{-px})^2}$

Objective reached. But if you try Wolfram Alpha to do it, you'll take a different answer:


Ok, no problem. Let's show that both answers are equivalent.

$ = \frac{pe^{-px}}{(1  +  e^{-px})^2}$

$ = \frac{(e^{2px})pe^{-px}}{(e^{2px})(1  +  2e^{-px}  +  e^{-2px})}$

$ = \frac{pe^{px}}{e^{2px}  +  2e^{px}  +  1}$


And finally

$ = \frac{pe^{px}}{(e^{px}  +  1)^2}$ 

Limits in $+\infty$ and $-\infty$

The two limits are easy to do:

$lim_{x \to +\infty }{\frac {1}{1 + e^{-px}}} = \frac {1}{1 + \frac{1}{\infty}} = \frac {1}{1 + 0} = 1$

$lim_{x \to -\infty }{\frac {1}{1 + e^{-px}}} = \frac {1}{1 + e^{p\infty}} = \frac {1}{1 + \infty} = 0$

Usando R e Wolfram Alpha

É muito fácil usar tecnologia hoje em dia. Ao menor toque, um dispositivo reconhece exatamente o que você deseja fazer. A loja virtual "adivinha" com grande precisão aquele produto que você desejava tanto comprar, mostrando ele em destaque, logo na primeira página.
Só que, do outro lado, está o pessoal que desenvolve essas coisas. E, de forma inversa, eles precisam redobrar os esforços para construir essas interfaces inteligentes. Novas tecnologias trazem novos desafios de implementação, exigindo muita criatividade e conhecimento. Na maioria das vezes, essas soluções vêm na forma de modelos matemáticos que, seja em software, seja em hardware, precisam ser implementados.

Esse artigo mostra como usar o R Project for Statistical Computing e o Wolfram Alpha para resolver, com enorme facilidade, problemas comuns no dia a dia de quem trabalha no desenvolvimento de novas tecnologias e projetos de forte caráter inovador.

O que você vai precisar

Vamos precisar do R e do Wolfram Alpha. O Wolfram é uma ferramenta web.  Então tudo que você vai precisa é acessar o endereço http://wolframalpha.com e voilà.



Para usar o R, você vai precisar instalá-lo na sua máquina. Baixe o instalador do site da ferramenta e depois é next next next. Para executá-lo, basta dar um duplo clique no ícone da área de trabalho. 

Ambas as ferramentas são gratuitas. Não é necessário criar conta nem cadastrar email. Ready-to-use!

O que vamos fazer

Para efeito de exemplo, vamos trabalhar com a função sigmóide:


Escolhi essa função porque ela é realmente importante. Ela é utilizada em todo lugar. O pessoal de aprendizagem de máquina adora usar ela como função de ativação em redes neurais artificiais:




Estatísticas sócio-econômicas, controles de sinais elétricos, planejamento de tráfego, processamento de imagens e um monte de outras coisas são feitas com a função sigmóide. Ela é realmente a função da moda


A forma analítica mais simples da sigmóide é essa:

$S(x) = \frac{1}{1 + exp(-x)}$ 

As razões para se usar tanto a sigmoide são:
1) Ela é simples. Fácil de implementar e seu custo computacional é baixo;
2) Ela é contínua para qualquer valor de x. Dessa forma, ela sempre vai dar uma resposta para qualquer entrada;
3) Ela é derivável para qualquer valor de x, o que torna sua forma suavizada;
4) Ela é limitada entre 0 e 1, não importa qual o valor de x, o que permite obter uma saída controlada, mesmo com uma entrada incomum.

Vamos usar uma forma parametrizada da sigmóide, que possui um único parâmetro p:

$S(x) = \frac{1}{1 + e^{-px}}$

O parâmetro p vai ser útil logo mais.

Faça a análise visual!

A primeira coisa que fazemos quando analisamos algo é visualização. Com um modelo matemático não poderia ser diferente. Vamos usar o R para isso. 

Na tela do R digite:

p <- 1

E aperte a tecla ENTER. Não se preocupe, nada vai acontecer. A única coisa que você fez foi informar ao R que existe um parâmetro p e o valor dele é 1.

Em seguida, digite:

x <- seq(-10, 10, 0.1)

E tecle o ENTER. Estamos declarando uma variável x e dizendo ao R para inicializá-la com uma sequência de números, começando com -10 até o 10, com passos de 0.1. Agora, vamos fazer algo mais complicado. Digite:

s <- 1/( 1 + exp(-p * x))

Como habitual, tecle o ENTER para que o R reconheça o que você digitou. Estamos declarando uma variável s. Como x é uma sequência, s também é uma sequência. Cada valor da sequência s é calculado com a fórmula que você digitou. Desse modo, teremos 1 valor em s para cada valor em x.

Agora estamos prontos para gerar o nosso primeiro gráfico com o R. Digite:

plot(x, s)

A tela do R deverá estar assim:


O mesmo gráfico pode ser desenhado com o Wolfram. Para demonstrar isso, vamos abrir o navegador no endereço da ferramenta clicando aqui.

No alto da página tem uma caixa de texto. Dentro dela digite:

plot 1/(1+exp(-x)) from x=-10 to 10

E aperte ENTER. O Wolfram vai atualizar a tela e mostrar isso:


Esse foi um gráfico muito simples de ser criado.  Mesmo assim, já podemos identificar algumas coisas. Uma delas é que a função é limitada entre 0 e 1. Se x for muito grande, a função se aproxima do valor 1. Se x for muito negativo, a função se aproxima do valor 0. Isso se mantém indefinidamente. Por exemplo, se você alterar o range do gráfico:

plot 1/(1+exp(-x)) from x= -100 to 100

Vamos ter ainda o mesmo comportamento:


Essa é uma propriedade muito interessante. Por exemplo, se você está desenvolvendo algo que transforma uma sinal elétrico variável em uma saída limitada, usando a sigmóide sua saída estará sempre controlada entre 0 e 1, mesmo durante um surto de tensão.

Um outro ponto interessante do gráfico é a evidente suavidade da função. Se você está planejando a trajetória de um vôo, provavelmente vai desejar usar a função sigmóide à esquerda do que usar uma trajetória como a da direita:

A grande diferença entre as duas trajetórias está nos pontos destacados com círculos verde. Naqueles pontos, a direção do avião precisa mudar abruptamente, o que é, no mínimo, desagradável.

Perturbando a  função sigmóide

Usar o Wolfram é muito fácil. Mas algumas coisas são mais fáceis de fazer no R. Vamos agora ver o que acontece quando alteramos o valor de p.

No R, digite:

p <- 2
x <- seq(-10, 10, 0.1)
s <- 1/( 1 + exp(-p * x))
plot(x, s, type="l", col="green")
p <- 1
x <- seq(-10, 10, 0.1)
s <- 1/( 1 + exp(-p * x))
par(new=TRUE)
plot(x, s, type="l", axes=FALSE, col="blue")
p <- 0.5
x <- seq(-10, 10, 0.1)
s <- 1/( 1 + exp(-p * x))
par(new=TRUE)
plot(x, s, type="l", axes=FALSE, col="red")

E o resultado será:



Como podemos ver, p pode ser alterado para ajustar a inclinação da sigmóide. Isso é muito útil, pois conseguimos ter um maior controle da forma da função.

Por exemplo, vamos supor que precisamos planejar a trajetória sigmóide de um vôo de avião. Vamos supor ainda que a inclinação máxima permitida seja de 30º. A questão que surge é: quais valores de p atendem a esse requisito?

Lá do cálculo diferencial, sabemos que a inclinação de qualquer curva é dada pela sua função derivada. Logo, precisamos saber qual é o valor máximo da derivada de S(x).

Calcular a derivada de S(x) "na mão" não é tarefa difícil. Nesse outro artigo, é mostrado como fazer isso com um papel e lápis.
O problema de fazer isso "na mão" é que tarefas desse tipo são cansativas, enfadonhas, propícias a erros e definitivamente não é produtivo. Não dá para fazer isso todo dia. Por outro lado, fazer isso no Wolfram é moleza, como podemos ver a seguir.

Acesse a página da ferramenta e entre com a seguinte consulta:

derivate 1/(1+exp(-p * x))

E rapidamente o Wolfram calculou a derivada de primeira ordem da sigmóide:


Não precisou de regra da cadeia nem de artifício algum. Em poucos segundos está lá a derivada prontinha.

Como a imagem mostra, o Wolfram calculou a derivada de S(x) como sendo:

$S'(x) = \frac{p e^{px}}{(1 + e^{px})^2}$ 

Da mesma forma que a sigmóide, podemos perceber que sua derivada S'(x) é sempre contínua. Se p = 1 então S'(x) tem a famosa forma de sino:


O gráfico mostra que o valor de S'(x) é máximo quando x = 0.

Podemos apenas supor que a forma da função se mantém igual para qualquer valor de p. Se essa suposição estiver correta, podemos pedir para o Wolfram fazer a seguinte conta para a gente:

derivate 1/(1+exp(-p * x)) , x = 0



O resultado mostra que a inclinação máxima é p/4. Como a inclinação máxima permitida é de 30º, temos p/4 = tg 30º. Logo, ao fixar o valor de p, temos que manter ele no máximo até p = 4 * tg 30º = 2.3.

Prove me com números!

A análise visual nos dá boas dicas sobre o comportamento da função. Mas não prova nada. Se quisermos ter absoluta certeza que a função se aproxima de 0 para x muito negativo e se aproxima de 1 para x muito grande, temos que provar isso. Em bom matematiquês, podemos dizer:

"O limite de S(x) quando x tende ao infinito negativo é ZERO e o limite de S(x) quando x tende ao infinito positivo é UM."

Ou, em notação matemática:

$ \lim_{x \to +\infty }{S(x)} = 1$ e $\lim_{x \to -\infty }{S(x)} = 0$ 

Calcular o valor desses limites com o Wolfram é muito fácil. Abra o Wolfram novamente no seu navegador e entre com:

lim 1/(1+exp(-x)) as x->infinity

O Wolfram calculou o valor do limite quando $x -> +\infty $ como 1, que era exatamente o que tínhamos esperado. Se repetirmos para infinito negativo:

lim 1/(1+exp(-x)) as x->-infinity

Como identificamos na análise gráfica, o valor do limite quando $x -> -\infty $ foi 0. O Wolfram realmente é demais!

Conclusão

15 anos atrás, quando iniciava meus estudos no cálculo, nunca imaginaria que as coisas iriam ficar tão fáceis como hoje. A capacidade de visualizar a informação facilmente e a interface simbólica e intuitiva do R e do Wolfram aceleram a produtividade e confiabilidade quando o assunto é matemática aplicada ao desenvolvimento de tecnologia atual. Como toda ferramenta, claro, o poder está na mão de quem a usa adequadamente.