Visualizaciones

domingo, 17 de marzo de 2019

Dia 6 - Noche

Hoy ampliaremos el tema de reinforcement learning introduciendo el concepto de Q-learning.

Previamente utilizábamos la ecuación de Bellman para calcular el próximo estado en función del estado actual y el valor de los estados futuros. Ahora calcularemos el valor asociado a la realización de cada acción individual ya que esta es la forma en la que el "agente" se debe desenvolver, no mirando los estados sin no las posibles acciones que puede llevar a cabo.


La fórmula resultante de aplicar el Q-learning sería la mostrada más arriba, en la que se expresa el valor asociado a realizar una acción en función de la recompensa por ir al siguiente estado, mas el sumatorio del valor máximo para el siguiente conjunto de acciones posibles multiplicado por los porcentajes de tomar cada acción ya que estamos en un entorno estocástico (con aleatoriedad), todo esto multiplicado por lambda que es el factor de descuento ( Valor entre 0 y 1 que indica cuan importante es el largo plazo, siendo 0 sin importancia y 1 toda la importancia). Como podemos observar, estamos ante u algoritmo iterativo en función de Q que representa acciones individuales.

A partir de ahora trabajaremos con esta fórmula, que es una representación más cercana al objetivo al que queremos llegar para poder aplicar el reinforcement learning.

Esto marca las bases del Q-learning, próximamente espero poder explicarlo más en profundidad pero ahora no tengo los conocimientos necesarios. Día a día iré ampliandolos y plasmándolos aquí, así podremos ver el progreso que sigo y por qué no, podréis aprender conmigo.

Un saludo!

sábado, 16 de marzo de 2019

Dia 5 - Noche

Hoy continuaré hablando sobre el "reinforcement learning", introduciendo conceptos como Markov Decission Process (MDP), Markov Process y alguno más.

La última vez hablamos sobre la ecuación de Bellman, que asignaba valores a los distintos estados en función de lo positivo que fuera el estado destino. Hoy comenzaremos con algunas definiciones:

-Markov Process: En un proceso de Markov, la probabilidad de comportamiento futuro, esta totalmente definida si se conoce el estado actual, es decir, los estados futuros no dependen de acciones pasadas si no del estado en el que te encuentras y de la acciones que puedes tomar.

-Markov Decission Process (MDP): Define un entorno con aleatoriedad, en el que puede que las cosas no sucedan como se espera. Es un proceso de control estocástico de tiempo discreto que proporciona un marco matemático para modelar la toma de decisiones en situaciones donde los resultados son en parte aleatorios.

Si utilizamos el MDP en reinforcement learning, habrá que modificar la ecuación de Bellman ya que ahora habrá varias posibles decisiones que tomar, con sus porcentajes de probabilidad.


Arriba muestro la ecuación de Bellman usada previamente, sin incluir MDP y abajo la ecuación modificada.


Como podemos ver, hemos modificado la segunda parte de la fórmula, en la que antes se incluía solamente un término, al escoger el siguiente estado con mejor "puntuación". Ahora obtendremos distintos valores para los estados de nuestro sistema, al tener en cuenta todos los posibles estados futuros.


Así quedarían los valores de los estados ahora, como podemos ver los estados cercanos al fuego se han visto muy penalizados ya que llegar a ese estado implica obtener un refuerzo negativo (-1) y ahora tenemos la posibilidad de terminar en ese estado porque utilizamos MDP.

Me gustaria tambien hablar sobre dos conceptos que he aprendido a diferenciar y que se repiten bastante en el curso de IA, estos son:

-Plan: Conjunto de acciones que deben ser seguidas al pie de la letra para llegar a un estado final desde un estado concreto. En caso de que algo vaya mal, se deberá volver a planear.

-Policy: Conjunto de todos los planes posibles que te permiten llegar a un estado final desde un estado concreto, por lo que si fallas no debes volver a planearlo si no que ya sabes que acciones debes tomar.

Las policys son mucho más potentes que los planes ya que se desenvuelven mejor cuando las cosas no salen como estaban planeadas, te proveen de una estrategia para alcanzar tu meta en vez de marcarte unos pasos a seguir sin poder equivocarte si quieres llegar a la meta como hacen los planes.


Y bueno, con esto termino por hoy. 

Un saludo!!


viernes, 15 de marzo de 2019

Dia 4 - Noche

Hoy hablaré de la terminal, ese instrumento tan potente que nos facilita tanto las cosas y nos hace parecer verdaderos hackers.

No daré datos técnicos ya que no quiero hacer posts muy largos, en este caso explicaré como tengo customizada mi terminal y por qué esto resulta tan útil.

Primero de todo, si utilizais un mac deberéis instalar iTerm en cambio si utilizais linux deberéis instalar terminator. Esto son terminales con muchas más características de las que vienen por defecto en los sistemas, tienen un montón de funcionalidades como pueden ser :

-Crear múltiples ventanas con sesiones diferentes
-Búsqueda
-Autocompletado


Resultado de imagen de terminator linux
En caso de que utiliceis macOS, para instalar el resto de elementos que nombro a continuación deberéis descargar brew, un gestor de paquetes que, por suerte es tan sencillo de instalar como escribir esto en vuestra terminal:
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Utilizo zsh, esto es un potente intérprete de comandos que puede funcionar como shell interactiva y como intérprete de lenguaje de scripting, ofrece numerosas ventajas como:

-Eficiencia
-Completado de tabulador mejorado
-Manejo de arrays
-Totalmente personalizable
-Expansion de rutas

Mi terminal actualmente luce así  -->



Para conseguir una terminal como esta, lo primero que debéis hacer es instalar zsh en vuestro ordenador, aqui os dejo un enlace que explica como hacerlo. El enlace os llevara al repositorio GitHub de este proyecto en cuyo readme encontrareis las instrucciones a seguir.

Muy bien, ya casi hemos terminado. Para poder customizar nuestra nueva terminal, deberemos instalar Oh-My-Zsh, que es un proyecto de código abierto que te permite administrar la configuracion de zsh. Os dejo el link a la página oficial donde explican como instalarlo aquí.

Vuestro terminal sigue igual que antes pero por poco tiempo, un poco mas y seréis capaces de configurarlo a vuestro gusto. Para ello instalaremos el que es considerado actualmente el mejor tema para zsh por la configuración por defecto tan útil que utiliza y por las inmensas opciones de personalización que ofrece llamado powerlevel9k. Una vez más, dejo el link en el que enseñan como instalarlo aquí.

Llegados a este punto solo quedan dos cosas, seleccionar un tipo de letra y modificar la configuración del terminal. Como letra utilizaremos las llamadas Nerd Fonts, podéis escoger la que queráis de entre ellas. Las escogemos por la amplia variedad de iconos que ofrecen y que podremos ver en nuestra terminal. Descargar e instalar desde aquí.


Una vez instalada, vamos a iTerm2 > Preferences > Profiles > Text y cambiamos el tipo de letras seleccionadas por nuestra Nerd Font.

Para configurar nuestro zsh deberemos acceder al fichero zshr para editarlo, esto lo podemos hacer escribiendo lo siguiente en el terminal: vi ~/.zshrc
Al acceder encontraremos un monton de parametros y comentarios de los que no cambiaremos nada, simplemente debemos ir al final del archivo y pegar esto:




# General config
POWERLEVEL9K_MODE='nerdfont-complete'
POWERLEVEL9K_INSTALLATION_PATH=$ANTIGEN_BUNDLES/bhilburn/powerlevel9k

# Prompts
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then
  POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(os_icon ssh context dir virtualenv vcs)
else
  POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(os_icon user dir virtualenv vcs)
fi
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status root_indicator battery time)
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
POWERLEVEL9K_SHORTEN_DELIMITER=..
POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR='\uE0B4'
POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR='\uE0B6'
POWERLEVEL9K_PROMPT_ON_NEWLINE=true
POWERLEVEL9K_PROMPT_ADD_NEWLINE=true
#POWERLEVEL9K_RPROMPT_ON_NEWLINE=true
POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX="╭"
POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX="╰\uF460\uF460\uF460 "

# Colors
POWERLEVEL9K_VIRTUALENV_BACKGROUND=107
POWERLEVEL9K_VIRTUALENV_FOREGROUND='white'
POWERLEVEL9K_CUSTOM_NOW_PLAYING_BACKGROUND='blue'
POWERLEVEL9K_CUSTOM_NOW_PLAYING_FOREGROUND='black'
POWERLEVEL9K_OS_ICON_BACKGROUND='white'
POWERLEVEL9K_OS_ICON_FOREGROUND='black'
POWERLEVEL9K_TIME_BACKGROUND='white'
POWERLEVEL9K_TIME_FOREGROUND='black'

# Battery colors
POWERLEVEL9K_BATTERY_CHARGING='107'
POWERLEVEL9K_BATTERY_CHARGED='blue'
POWERLEVEL9K_BATTERY_LOW_THRESHOLD='50'
POWERLEVEL9K_BATTERY_LOW_COLOR='red'
POWERLEVEL9K_BATTERY_CHARGED_BACKGROUND='blue'
POWERLEVEL9K_BATTERY_CHARGED_FOREGROUND='white'
POWERLEVEL9K_BATTERY_CHARGING_BACKGROUND='107'
POWERLEVEL9K_BATTERY_CHARGING_FOREGROUND='white'
POWERLEVEL9K_BATTERY_LOW_BACKGROUND='red'
POWERLEVEL9K_BATTERY_LOW_FOREGROUND='white'
POWERLEVEL9K_BATTERY_DISCONNECTED_FOREGROUND='white'
POWERLEVEL9K_BATTERY_DISCONNECTED_BACKGROUND='214'

# VCS colors
POWERLEVEL9K_VCS_CLEAN_FOREGROUND='cyan'
POWERLEVEL9K_VCS_CLEAN_BACKGROUND='black'
POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND='white'
POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND='red'
POWERLEVEL9K_VCS_MODIFIED_FOREGROUND='black'
POWERLEVEL9K_VCS_MODIFIED_BACKGROUND='yellow'
Y ya estaría, así dispondremos de una terminal potente, actualizada y con estilo!

Muchas gracias por leer y hasta otra!






jueves, 14 de marzo de 2019

Dia 3 - Noche

Trabajar mucho es importante, pero no se deben descuidar el resto de cosas. Con esto me refiero a que hay que saber distribuir el tiempo.

A mi forma de ver, no dedicar tiempo a mejorar tus capacidades es un desperdicio, pero tampoco debes centrarte únicamente en ello, ya que esto desgasta y puede entorpecerte en vez de ayudarte.
Relacionarse con la gente, hacer deporte, leer una novela... son actividades que te pueden ayudar a despejarte y conseguir un nuevo enfoque cuando llevas mucho tiempo trabajando en algo, por ello animo a todas las personas que me leais a que probéis a realizar descansos con cierta frecuencia y me comenteis si mejora vuestro rendimiento.

Hoy he comenzado el curso de IA, todavia estoy en la parte introductoria, aún no ha empezado lo divertido de verdad, pero he aprendido un par de cosas. Los primeros temas hablan del aprendizaje por refuerzo. Explican que el aprendizaje por interacción es probablemente en lo que todos pensamos cuando pensamos en la naturaleza del aprendizaje, que un pájaro no sabe por qué comienza a mover las alas para volar, pero que la respuesta que recibe del entorno (causa y efecto) cuando lo hace, le indica que debe seguir haciéndolo.

El aprendizaje por refuerzo se basa en esta idea, de formas que mediante exploración, utilizando la ecuación de Bellman se puede aprender que hay estados más favorables que otros y por tanto aprender a evitar los estados desfavorables.

En la siguiente imagen podemos ver cómo se asignan valores a los distintos estados dependiendo de lo positivo que sea ir a ese estado, así se podrá decidir que camino seguir en función del valor de los estados adyacentes.



Esta explicación es muy superficial ya que no he podido profundizar en el tema aun, pero de todas formas quería compartirlo con vosotras y vosotros.

Un saludo!


miércoles, 13 de marzo de 2019

Dia 3 - Mañana

Buenos días!

Desde este verano soy desarrollador full stack, pero al no haber terminado la universidad no he podido empezar a trabajar (Lo primero es lo primero). Como desarrollador, muchas veces necesitas hacer cosas y ver el resultado de forma inmediata para no tener que estar cambiando entre ventanas(Ejemplo: animaciones con js y css, scripts js...).

Una página muy útil con muy buen contenido, sobre todo para animaciones y estilos es codepen, en ella puedes encontrar casi de todo funcionando y puedes visualizar el resultado al instante. Es sencillo realizar proyectos en codepen ya que dispones de varias ventanas para el código (html, js y css) y otra para ver los resultados, cada cambio que realizas en el código actualiza el estado del proyecto lo que te permite ver los cambios en tiempo real, algo muy útil en muchos casos.

Codepen contiene material muy interesante en el que te puedes fijar para aprender nuevas técnicas que usar en tus proyectos. A mi forma de ver, codepen es un rincón donde guardar proyectos pequeños en los que probar cosas nuevas, mientras que GitHub es el lugar donde publicas los  grandes proyectos.

Con esto termino el primer post de hoy, un saludo!

Dia 2 - Noche

Hoy he pasado el dia completo terminando la práctica de Ingeniería de Software, esta consistía en realizar una aplicación que simulara el uso de un lavavajillas, las tecnologías utilizadas han sido Maven, MagicDraw (Para realizar los modelos y diagramas) y el IDE de oracle, todo ello programado en java.

Ha sido una carrera contrarreloj ya que había que terminarla antes de las 12 de la noche, pero el resultado ha sido muy satisfactorio.

Al tener que explicar el funcionamiento de algunas parte del código a otros compañeros, me he dado cuenta de que decir las cosas en alto, a menudo te hace darte cuentas de errores que has cometido. En mi caso fue un error que tenía con la clase que utilizaba el timer para temporizar el uso de los distintos programas del lavavajillas que impedía que la ejecución del programa terminara.

En resumen,  emplear tiempo en comprender el funcionamiento de tu programa es muy beneficioso.

Como curiosidad de hoy, hablaré de una noticia que he leído y me ha llamado bastante la atención, y es que google ha incluido el buscador DuckDuckGo en sus opciones de buscador predeterminado. Para las personas que no hayáis oído hablar de este buscador, es una alternativa a los buscadores convencionales que surgió en 2006 y que recientemente ha ganado una gran cantidad de público debido a sus características únicas.

¿Cuáles son estas características y por que me ha llamado la atención la noticia?

La principal característica de este buscador y por lo que ha ganado gran cantidad de adeptos es que prioriza la privacidad de los usuarios ante todo, cosa que no es una práctica habitual del famoso buscador google. Resulta una noticia llamativa dado que el nuevo buscador es un claro competidor de google por su oferta de privacidad y potencial al trabajar en conjunto con Yahoo.

Por mi parte y como usuario de google agradezco que nos amplíe el abanico de posibilidades con opciones tan interesantes como DuckDuckGo.

Con esto termino por hoy, un saludo!


Dia 2 - Mañana

Buenos días, voy a comentar rápido que tengo mucho que hacer.

Programar es una actividad que se puede realizar en casi cualquier situación siempre que dispongas de un editor de texto. Una buena lista de reproducción de música puede hacer la tarea de programar mucho más amena, por eso os voy a dejar un enlace a la lista de reproducción que escucho cuando voy a programar por largos periodos de tiempo.

Eso es todo por ahora, un saludo!