Buenas, bueno, yo habia entrado aqui buscando tutoriales de hackeo para win, pero como estoy tan rayado ya... y vi tu post y como es algo que intente en el pasado pues te comento una idea que se me ha ocurrido.
Ya en el pasado probe a hacer algo parecido. En una ocasion hice un bot de IRC, muy sencillo, era un simple bicho que respondia a comandos o preguntas estrictas con respuestas o acciones predeterminadas. Fin. Eso no tiene mucha gracia, verdad?
En otra ocasion intente con redes neuronales. Eso tiene mas gracia, pero no se puede hacer a lo loco. Las redes neuronales artificiales responden a los entrenamientos, si. Pero no se puede simplemente darle una entrada de datos totalmente arbitraria, sin haberla preparado para que tenga un cierto sentido estructural antes, y esperar que la red neuronal responda de manera inteligente. Al menos no con una red de tan pocas neuronas y de estructura tan simple como las que permiten los ordenadores(si, soy español) de hoy dia. Finalmente intente crear un programa de entrenamiento neuronal, que consistia en hacer permutaciones de la estructura neuronal, hasta dar con la estructura mas eficiente para el resultado buscado. Generalmente el entrenamiento neuronal consiste en un reajuste de los pesos de los puentes neuronales para adecuar la respuesta dada a la respuesta esperada; asi que modificar la estructura neuronal era ir un pasito mas alla, pero tampoco es que hiciera milagros. No suele haber indicadores a la hora de diseñar la estructura neuronal que mejor realice un trabajo determinado; es mas una cuestion de prueba y error. Por eso era importante para mi automatizar este proceso de modificacion de la estructura y ver hasta donde podia llegar.
Lo que se me ha ocurrido es lo siguiente(no se si es algo descabellado):
Crear tablas de significado unico por cada palabra, y conseguir un significado unico y completo (como el humano) por cada frase -> procesarlo por una red neuronal -> traducir la respuesta a la inversa con dichas tablas. Me explico:
Analogia:
Como formamos 256 numeros unicos(significados unicos) con tan solo un byte?
Un byte tiene 8 bits. Cada uno de ellos tiene dos unicos estados (1 o 0), pero combinando cada uno de ellos en sus distintos estados conseguimos 256 numeros distintos. Esto funciona porque cada bit es interpretado segun la posicion que ocupa dentro del byte.
Si decimos que cada uno de esos bits es una palabra o la raiz de una palabra (que tiene significado unico por si sola), y los combinamos de manera analoga a como se hace en el byte, obtendriamos 256 significados unicos (frases de diferente significado)
Esto se hace mediante ORs. Por ejemplo:
1: perro
2: bonito
4: esta
8: triste
16: gato
32: feo
64: corre
128: feliz
perro bonito esta triste -> 1+2+4+8 = 15 (15 seria el significado unico que representaria a la frase "(el) perro bonito esta triste")
gato feo corre feliz -> 16+32+64+128 = 240 (240 seria el significado unico que representaria a la frase "(el) gato feo corre feliz")
perro feliz esta feo -> 1+128+4+32 = 165 (165 seria el significado unico que representaria a la frase "(el) perro feliz esta feo")
etc
Esto tiene un problema:
p.e.: "el perro feliz esta feo" y "el perro feo esta feliz" tendria el mismo significado, pero sabemos que en realidad no es asi. No es lo mismo "el perro (que es) feliz esta feo", que "el perro (que es feo) esta feliz". Lo primero apunta a un perro que por lo general suele estar feliz, o que en ese momento esta feliz, y le añade a este un estado (esta feo). Lo segundo apunta a un perro cuya caracteristica es la de ser feo, y añade un significado de estado: esta feliz.
La solucion pasaria por un filtrado de subsecciones semanticas o sintacticas del lenguaje. Obtener el valor significativo unico de cada subseccion, y OR'earlo a la sección padre junto con un bit extra que le indique a la sección padre, que el significado proviene de una sección hija, de modo que el significado final del padre, sea el conjunto completo de padre e hijo y la diferenciacion clara de lo que es el padre y lo que es el hijo. (Esto se me esta complicando
) No tengo muy claro hasta que punto seria esto factible. Voy con un ejemplo, a ver si me puedo aclarar yo mismo, jaja:
De hecho, he pensado que seria imposible determinar el padre y el hijo mediante un solo bit. Por eso creo que la manera adecuada, seria mediante el posicionamiento de los bytes. Vamos a determinar que el byte mas anterior sea el padre del siguiente. Ejemplo:
"el perro feliz esta feo":
"el perro feliz" -> 1+128 = 129
"esta feo" -> 4+32 = 36
"el perro feliz" "esta feo" -> 129 36
si esto lo traducimos en bits, usando dos bytes y no uno, seria:
10000001 00100100
si en lugar de OR'ear estos dos bytes (como haciamos antes con todos los bits) interpretamos los dos bytes tal cual, es decir, asignando nuevos valores de significado unico para los bits del byte superior (el anterior), tendriamos un significado unico de:
33060
"el perro feo esta feliz":
"el perro feo" -> 1+32 = 33
"esta feliz" -> 4+128 = 132
"el perro feo" "esta feliz" -> 33 132
00100001 10000100
8580
Por tanto ahora cada frase tendria un significado completamente distinto, justo como en la realidad.
Y procederiamos asi indefinidamente hasta resolver toda la jerarquia sintactica
Mas problemas:
Hay que tener en cuenta que el español, por ejemplo, consta de unas 90mil palabras.
Si cada palabra tomara un valor unico y OR'eable como se explico al principio, tendriamos valores ENORMES, que ningun ordenador actual seria capaz de procesar directamente, PERO, mediante un proceso secuencial, se podria lograr. Es decir, el ordenador no necesita saber que un significado consta de 100mil bytes(por ejemplo), solo necesita procesarlo adecuadamente, con la unidad mayor de informacion de que sea capaz (bytes, palabras de 64bits, etc).
Si ademas, añadimos el hecho de que deberemos utilizar secciones del numero de bits que corresponda al conjunto de todas las palabras del lenguaje, y que cada subseccion semantica podria ser hija de otra sección, tendriamos numeros ASTRONOMICOS. Por ejemplo, si el español consta de unas 90mil palabras, deberiamos manejar secciones compuestas de 90mil bits. Como "esta feo" es una subseccion semantica que pertenece a "el perro feliz", tendriamos una entrada de nada menos que 180mil bits.
Empieza a parecerme que mi acercamiento a la interpretacion del lenguaje humano, aunque parece ser factible y funcional, es ,hoy por hoy, impractico
En definitiva, este seria el proceso que yo utilizaria principalmente:
*Filtrar la entrada: eliminar palabras carentes de significado per se, como los articulos determinados (el la), etc.
*procesar la estructura sintactica de la entrada y encontrar las antedichas subsecciones semanticas
*alimentar el valor significativo y unico final a una red neuronal
*entrenar dicha red para que responda:
-con acciones
-con lenguaje humano: se procesa la salida de manera inversa a como se proceso la entrada alimentada a la red, traduciendo mediante tablas las diferentes subsecciones semanticas, obteniendo una estructura sintactica final con sentido semantico unico
Y ya, para terminar, el summum del summum:
*que el ordenador modifique la estructura de su propia red neuronal, acorde con el significado extraido de la entrada:
Al principio, podria modificarse a si mismo, segun lo que interprete de lo que le digamos, en definitiva solo estaria siguiendo ordenes complejas, nada nuevo.
Si le programamos una subrutina que se lance cuando el significado unico de la entrada diga algo asi como "te odio" o "me parece que eres tonto", etc. Esta subrutina podria hacer modificaciones estructurales minimas en la red neuronal, de modo que la siguiente entrada no seria interpretada exactamente del mismo modo que la primera vez, pero aun conserva la capacidad suficiente de interpretacion como para tener un alto grado de coherencia en sus respuestas. Sin embargo, tras ciertas llamadas a esta subrutina, se experimentaria un cambio(experiencia) final que se alejaria mas y mas del entrenamiento inicial(nacimiento), llegando al punto de que el sistema pudiera generar autenticas nuevas salidas(soluciones, opinion), y que no reaccionara del mismo modo anterior para llamar a su subrutina de modificacion estructural(comportamiento, se vuelve terco o complejo).
Por supuesto habria que mantener unos bancos de memoria enormes para almacenar la serie de entradas y salidas pasadas, un historico, y darle una subrutina para que el mismo pueda comprobarlas cuando reaccione a una determinada entrada, que bien pudiera haberse diluido o modificado de la inicial puesto que recordemos que incluimos una subrutina de modificacion estructural. De este modo, gozaria de un simil de la memoria humana, y accederia a ella, para sumarsela a la entrada, segun la entrada inicial lo exigiera, dando como resultado algo que no depende exclusivamente de la entrada recibida ni de su estructura neuronal, sino tambien de su memoria o experiencia(mas alla de su estructura neuronal).
Tambien podria incluirse el factor tiempo, para que pueda recordar y goce de un pensamiento mas humano. Se incluiria una subrutina cuyo proposito fuera el de llamar a la subrutina de acceso a los bancos de memoria (recordar), cogiendo varios y alimentandolos como entrada, para generar una nueva salida, que como ya habreis adivinado, puede ser decir algo, o realizar una accion practica, entre las que se incluirian las susodichas subrutinas de modificacion estructural, acceso a memoria pasada, y alimentacion a la misma subrutina tiempo inicializandola con valores basados en la entrada, para que, segun la entrada, sea llamada en un determinado siguiente momento... Y vuelva a recordar, y a modificarse a si mismo, etc, etc, etc...
Pfiuuu...
Bueno, pues eso es lo que yo NO haria jajajajaja
Yo cogeria algo hecho ya por ahi, e intentaria adaptarlo a mis necesidades.
Como elucubracion esta bonito, pero como proyecto practico queda bastante alejado de la realidad, me parece a mi.
Pero oye, si conseguis hacerlo asi como yo he dicho, me encantaria verlo. Seria algo asi como una conciencia en si misma...
Me avisais cuando lo hagais jajaja
Saludos
Edito:Un par de apuntes mas (o elucubraciones):
*Aclarar que el procesamiento de numeros mas grandes de los que puede manejar el ordenador no es ninguna invencion, y es perfectamente factible. Si tenemos un sistema de arquitectura de 64bits, con un S.O. de 64 bits, abrimos una calculadora y calculamos el valor de 2 elevado a 64, vemos que nos da el resultado decimal, pero si seguimos sumandole 1, 1, 1... el resultado no se vuelve cero ni mucho menos. El programa de calculo utiliza este sistema de procesamiento al que me referi anteriormente, y nos sigue dando numeros mas altos de los que el sistema es capaz de utilizar per se.
*Habiamos calculado que "el perro feliz esta feo" ocuparia nada menos que 180mil bits, lo que viene a ser 21Kbs nada menos! Pero hay que tener en cuenta, que dificilmente un ser humano lograria componer una frase(o mejor, una subseccion semantica) con la totalidad de las palabras de la lengua española. Por lo que, en definitiva, la mayoria del espacio ocupado por ese "significado", constaria de 0's. Y eso significa que se podria comprimir, y terminaria ocupando muchiiisimo menos, nada que ver. Y no solo seria practico la compresion y descompresion para almacenarlo en la memoria(de recuerdos), sino que incluso se podria utilizar en si misma(sin descomprimir en la practica) a la hora de la interpretacion de los significados mediante el anteriormente citado procesamiento secuencial. Y quizas incluso ahorrariamos ciclos de proceso.
Problem solved!
Lo se, soy un alucinado de la vida