Interfaces telepáticas: quando o Mundo do Amanhã chega hoje mesmo

Recentemente, surgiu aqui no Labs um anteprojeto de um projeto para talvez, quem sabe, trabalharmos com a identificação automática de fases do sono em “polissonografias”, que são dados neurofisiológicos e cardio-respiratórios coletados de pessoas dormindo. A parte neurofisiológica da coisa serviu de inspiração para eu escrever este artigo acerca das “interfaces telepáticas”, como as chamo. Alguns diriam que “interfaces neurais” talvez seja um termo melhor, mas gosto das imagens de pulp scifi que “telepáticas” evoca. :)

Aliás, o tema de interfaces capazes de ler diretamente a mente do usuário é recorrente na ficção científica. A mais antiga referência _scifi_ sobre interfaces telepáticas de que me lembro está no clássico inesquecível O Planeta Proibido. Numa das cenas desse filme de 1956, um dos personagens usa um aparelho que é capaz de ler e interpretar sua mente, inclusive mostrando as imagens em que ele está pensando. No filme, essa tecnologia é alienígena e apresentada como algo centenas de milhares de anos à frente da ciência humana – o que é bastante curioso, considerando-se que o filme se passa séculos no futuro, em uma época onde os humanos viajam pelo espaço em discos voadores antigravitacionais e cruzam anos-luz em tempos razoáveis passando pelo “hiperespaço”.

Ou seja, esse parece ser mais um dos casos muito freqüentes em que a ficção científica acerta acerca de uma previsão sobre o futuro, mas erra feio a ordem do que virará realidade primeiro. Alguns experimentos com resultados inesperados e algumas teorias exóticas até dão alguma esperança de que um dia teremos antigravidade de disco voador ou saltos hiperespaciais como no filme, mas na melhor das hipóteses isso está num futuro imprevisivelmente distante. Já as interfaces telepáticas estão bem próximas. Mais precisamente, elas já estão aqui!

Lembro de pesquisas sobre leitura e interpretação de sinais cerebrais desde os anos 90. Inicialmente, essas pesquisas visavam ajudar pessoas com deficiências físicas, possibilitando a sinais de seus cérebros “contornar” paralisias e outras condições. A pesquisa de anos atrás sobre a movimentação do ponteiro de um mouse usando a mente é emblemática dessa era. Porém, como era de se esperar, essas pesquisas começam aos poucos a ser aplicadas ao mercado muito mais vasto de consumidores em geral…

Assim, há alguns meses surgiu a demonstração de uma interface de “subvocalização” para celulares, que capta os impulsos nervosos que o cérebro envia para a garganta e interpreta as palavras sem que a pessoa tenha de efetivamente verbalizá-las – ideal para ter conversas telefônicas privadas mesmo em ambientes cheios de gente. Também apareceu recentemente, e já está disponível comercialmente, um controle telepático para videogames.

Essas aplicações envolvem análise de sinais eletroencefalográficos ou atividade de conjuntos de nervos superficiais específicos – o que certamente já rende um bom número de aplicações divertidas, como exemplificado. Porém, esse meio de aquisição de certa forma capta apenas comandos que o cérebro emite “propositalmente”. Mas a verdadeira fronteira final das interfaces telepáticas, que vai além da captação de comandos diretos do cérebro, envolve a observação direta da atividade cerebral, que potencialmente poderia levar à possibilidade de saber o que uma pessoa está realmente pensando. Uma pesquisa divulgada poucas semanas atrás por exemplo descobriu que as mesmas áreas cerebrais tendem a se ativar quando pessoas diferentes estão pensando na mesma palavra, um princípio que se bem desenvolvido poderia levar a um “leitor universal de pensamentos”. Outra aplicação relativamente recente é o detetor de mentiras com 90% de acerto. Esta última, a propósito, cai no que muitos vêem como o “lado negro” das tecnologias de telepatia artificial, já que levanta uma série de questões éticas e legais.

É claro que, ao contrário do que acontece com as interfaces “eletroencefalográficas”, que no fim das contas usam simples eletrodos, essas aplicações bem mais ousadas observam a atividade cerebral por fMRI (do Inglês para Imagem por Ressonância Magnética Funcional), ou seja, usam máquinas enormes e caras, tornando difícil imaginar uma popularização desses métodos. Porém, avanços também recentes em magnetômetros atômicos acenam com a possibilidade de máquinas de fMRI portáteis e baratas em um futuro não muito distante. Mais espantosamente, magnetômetros atômicos poderiam em tese ser sensíveis o suficiente para monitorar o magnetismo até de neurônios individuais, podendo registrar a atividade cerebral com um nível de detalhe impensável hoje em dia. Talvez, quem sabe, até o suficiente para alcançar o “upload” tão almejado pelo movimento Trans-Humanista. Mas isso já é outra viagem, que talvez um dia eu tenha coragem de encarar em um artigo futuro. :)

Ciências cognitivas, Inovação, Memória, Usabilidade 0 Comentários

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)

O que é inteligência?

Como funciona o cérebro humano? A resposta desta pergunta solucionaria um dos maiores mistérios sobre a natureza do homem. Mas, como ainda não temos esta resposta, buscamos, através de diversas teorias, explicar como nós somos capazes de resolver problemas, memorizar enormes quantidades de dados, reconhecer padrões sensoriais (imagens, sons, cheiros, etc.) com grande rapidez, além de realizar diversas outras tarefas que não sabemos ao certo como são tratadas no nosso cérebro.

Uma das mais importantes teorias sobre o cérebro, mais especificamente sobre o córtex cerebral, foi cunhada pelo neurocientista Vernon Mountcastle e se refere às colunas corticais e aos padrões cerebrais. O córtex cerebral é a camada mais externa, constituída de tecido nervoso cinzento, que encobre a parte interna do cérebro (tecido nervoso branco) de todos os mamíferos. Nos humanos, o córtex possui seis camadas, cada uma da espessura uma carta de baralho. Acredita-se que quanto mais camadas, mais ‘inteligente’ a espécie – os golfinhos possuem apenas três camadas. Não entrarei em detalhes sobre a parte da teoria que fala sobre as colunas corticais, mas de uma forma geral elas mapeiam o córtex em uma arquitetura de colunas conectadas de forma hierárquica e dispostas nas seis camadas que constituem o córtex cerebral. Essa dica não ajuda muito a entender como as colunas funcionam (quem quiser se aventurar busque por: An Organizing Principle for Cerebral Function…” 1978, por Vernon Mountcastle), mas será importante para compreender como os padrões cerebrais são transformados em memórias e vice-versa.

Mas o que são estes tais padrões cerebrais? Você já deve ter ouvido falar das sinapses e dos pulsos elétricos (provavelmente nas aulas de biologia que você assitiu no segundo grau), utilizados pelas células cerebrais (neurônios), para se ‘comunicarem’ entre si. Não se lembra? Tudo bem. Imagine que o cérebro é formado por uma malha de bilhões de fios metálicos que trafegam freneticamente energia elétrica de um ponto a outro do cérebro. Hmm, mas e os padrões? Bom, os padrões podem ser compreendidos como sequências de pulsos elétricos, que passam a ter um significado se levado em consideração o intervalo de tempo que estes pulsos chegam ao cérebro. Para ficar mais interessante, pense em todos os seus órgãos sensoriais (olhos, ouvidos, pele, etc.) como conversores de padrões. Eles capturam, no ambiente externo, dados brutos de diversos tipos, fazem o devido tratamento e entregam os resultados ao cérebro no formato destes pulsos elétricos temporalmente ordenados. Dessa forma, o cérebro “apenas” tem que se preocupar em receber os padrões, reconhecê-los, catalogá-los, armazená-los e prover alguma forma de serem recuperados futuramente. É importante ressaltar que qualquer parte do córtex é capaz de tratar padrões provenientes de quaisquer fontes sensoriais.

Ei, espera aí. Qualquer parte do córtex é capaz de tratar padrões de qualquer origem? Mas como ficam aquelas teorias que sempre ouvimos falar sobre o cérebro ter uma área responsável por reconhecer padrões visuais, outra para lidar com a língua falada, outra para realizar raciocício matemático, etc. ? Mountcastle acredita que o córtex não é constituído de forma modular. Segundo ele, qualquer área do córtex é capaz de lidar com informações de qualquer natureza. Ah! É por isso que eu já vi vários casos de pessoas acidentadas perderem boa parte do cérebro e depois de um tempo de recuperação voltaram a viver suas vidas normalmente (ou quase). Sim, é muito provável que o cérebro funcione desta forma e, levando isto em consideração, podemos dizer que o córtex trabalha com um “algoritmo genérico de manipulação de padrões”. Ou seja, qualquer padrão que chegue ao cérebro ou trafegue por ele é tratado da mesma forma, sem essa de módulo que faz isso pra cá e módulo que faz aquilo pra lá.

O modelo forjado por esta teoria permitiu o avanço de diversas pesquisas sobre a organização e o processamento dos padrões cerebrais. Um exemplo disso: o criador do mundialmente conhecido Palm Pilot e entusiasta dos estudos sobre o córtex cerebral, Jeff Hawkins, que escreveu um livro em 2005 chamado OnIntelligence. Neste livro ele reforça com diversos outras suposições, relatos e experimentos as teorias de Mountcastle e ainda faz especulações sobre vários outros assuntos ainda não explicados sobre o funcionamento do cérebro. É importante ressaltar o autor de OnIntelligence é um computeiro e um sujeito bastante prático. Ele deixa claro que o seu objetivo, no final das contas, é converter as teorias criadas por neurocientistas, biólogos, psicólogos, filósofos e outros estudiosos (incluindo ele próprio) num modelo computacional aplicável à construção de máquinas inteligentes. Mas, o que chama atenção em seu livro é a forma com que ele aborda os principais fundamentos das teorias sobre o córtex cerebral, além de explicá-las de forma prática. De uma forma sintética, as principais responsabilidades do córtex, apresentadas por Hawkins, são:

  • Armazenamento sequencial de padrões: Quando o cérebro precisa armazenar alguma informação, os padrões que chegam ao córtex são armazenados de forma sequencial. Isso significa que o cérebro cria elos de comunicação entre os padrões de entrada, constituindo a memória a partir de um encadeamento de padrões. Como o tempo é levado em consideração durante este sequenciamento, as cadeias geradas também possuem informações temporais, que indicam o momento de chegada e/ou ativação de cada padrão. A ativação se refere ao acionamento de um padrão já armazenado no córtex, que também pode compor uma nova memória, combinando-se com outros novos padrões.
  • Capacidade de invocar padrões auto-associativos: Ao tentar se lembrar de algum fato, nosso cérebro começa a busca pelo padrão que inicializa a cadeia referente à memória que explica tal fato. Depois que este padrão foi recuperado, ele invoca o padrão consequente através do elo criado entre os dois. Este processo se repete até que toda a cadeia tenha sido recuperada e o fato relembrado. Por isso você consegue se lembrar do alfabeto de A a Z com facilidade, mas não consegue de Z a A, pois você não foi ‘treinado’ e não possui os padrões sequenciais necessários para se lembrar do alfabeto de trás p/ frente. É claro, que se você fizer um treinamento – pensando no córtex, este treinamento seria o armazenamento de padrões temporais que representam as letras de Z a A – semelhante ao que você fez para se lembrar de A a Z, você conseguirá facilmente realizar esta tarefa.
  • Armazenamento de padrões num formato invariante: Imagine que você está num parque brincando com uma criança. Você tem uma bola em suas mãos. A criança pede a bola e você a joga. Então a criança repete o seu gesto e joga a bola para você. Você a pega e continua a brincadeira. Todo o mecanismo necessário para realizar as ações que você e a criança executaram é tratado de forma ‘inconsciente’. Você não se preocupa com a velocidade da bola, as forças que atuam sobre ela, o seu peso, etc. Simplesmente a joga e depois a pega. Isto porque existe uma invariante armazenada no seu cérebro que representa ‘pegar algo’ e ‘jogar algo’. Uma invariante nada mais é do que um conjunto de padrões genéricos, que serve como modelo para o processamento de padrões mais específicos. Não existe, de forma detalhada, uma teoria que explique como são formadas as invariantes mas, acredita-se que as invariantes são as responsáveis por conseguirmos lidar com uma variedade enorme de estímulos durante o dia, sem ficar a todo momento se perguntando “o que é aquilo?” ou “como isto funciona?”.
  • Armazenamento padrões em hierarquia: Como já foi dito anteriormente, as colunas corticais são organizadas hierarquicamente. Os padrões mais genéricos e invariantes ficam no alto desta hierarquia. Padrões mais específicos ficam mais abaixo nesta hierarquia. Quando o estímulo vem dos órgãos sensoriais, os padrões são ativados num fluxo de baixo para cima nesta hierarquia de colunas. Mas quando imaginamos alguma coisa ou tentamos nos lembrar de um fato, os padrões são ativados de cima para baixo, das invariantes para os padrões específicos. Esta organização permite o reaproveitamento de padrões por diversos fragmentos de memória, evitando a replicação desnecessária e formando uma malha que facilita a recuperação posterior de informações.
  • Recuperação da memória auto-associativa: Basicamente, a recuperação de memórias funciona assim. Temos diversos padrões sequenciais armazenados no córtex. Você então passa a ele uma seqüência de padrões que representa uma caneta. Então o cérebro te devolve uma seqüência de padrões que representa a caneta e por fim você entende que é uma caneta. Parece meio estúpido a princípio, mas o mecanismo de recuperação de informação no córtex é algo extremamente poderoso. Por exemplo, se você passa, ao invés dos padrões da caneta inteira, padrões que apenas representam a ponta da caneta, ou a caneta de cabeça p/ baixo, ou apenas metade da caneta ou uma caneta deformada pelo fogo de um isqueiro ou… A resposta será a sequência completa de padrões que representam a caneta e você entenderá que é uma caneta. O nosso cérebro completa as informações com diversos padrões, realiza buscas nas invariantes, faz conexões associativas com outras cadeias de padrões e te devolve a resposta de maneira completa, desde que ela já esteja previamente armazenada. Estar previamente armazenada exige que seu cérebro já tenha sido exposto àqueles padrões.
  • Antecipação dos fatos: O cérebro prevê o futuro o tempo todo, mas não é como a mãe Diná que ‘enxerga um futuro distante’. As conseqüências de todas as nossas ações a curto prazo são antecipadas pelo nosso cérebro. Quando chegamos em casa depois do trabalho e giramos a maçaneta da porta, o cérebro já antecipa o quanto de força será necessário aplicar sobre a maçaneta para girá-la e empurrar a porta. Se as forças aplicadas abrirem a porta como o de costume, a antecipação é confirmada e o cérebro continua seu papel de ‘vidente a curto prazo’. Caso alguém tenha mexido na porta e a força aplicada não seja o suficiente para abrí-la ou enquanto você a empurra para trás ela fizer um rangido que antes não fazia, haverá uma violação na previsão e o cérebro tentará buscar padrões que expliquem o porquê disso. Logo, você pode considerar todo e qualquer tipo de aprendizado como um treinamento que construirá padrões a serem utilizados para antecipar fatos.

Se você sempre imaginou o cérebro como um processador utilizado em computadores, você pode estar se perguntando: Mas é só isso? Nosso cérebro somente lida com memórias em formato de padrões? Ele apenas faz o armazenamento e a recuperação de padrões? Nada de cálculos e processamentos complexos assim como os processadores fazem? Nada disso. Quando esticamos os braços para segurar uma bola jogada para nós, nosso cérebro não calcula a trajetória da bola, muito menos integra as forças para realizar a cinemática inversa, ele simplesmente consulta a memória e traz a resposta. Isso mesmo. O cérebro sempre consulta as respostas dos problemas que queremos resolver. Por isso temos que aprender técnicas para lidar com problemas complexos. Usamos estas técnicas para organizar as variáveis do problema na memória, recuperar os padrões necessários para reconhecer estas variáveis através de associações e, por fim, alcançar a solução (que também será armazenada). Problemas desconhecidos são resolvidos através de analogias a problemas conhecidos já armazenados em nossa memória.

Bom, agora que você já conhece um pouco sobre as teorias que são utilizadas para explicar o funcionamento do nosso cérebro, podemos definir o que é inteligência de uma forma bem simples. Basicamente, inteligência é a capacidade de antecipar as coisas. Os testes de QI exploram justamente esta capacidade. Portanto, segundo esta teoria, é possível que o cérebro seja treinado para se tornar inteligente (inclusive para tirar notas altas em testes de QI). Quanto mais invariantes e padrões mais genéricos para a resolução de problemas diversos, mais eficiente o cérebro será na antecipação de situações desconhecidas ou consideradas complicadas para a maioria das pessoas. Esta é apenas uma definição sintética de inteligência, baseada nas teorias de Mountcastle e Hawkins. Se você se interessou pelo assunto, vale a pena ler os trabalhos destes dois pesquisadores. Lembrando que Hawkins é um cara da computação e seu trabalho é uma releitura, fortemente direcionada à sua área, das teorias de Mountcastle.

Curiosidade: Os transistores que compõem um processador são muito mais rápidos que os neurônios. Enquanto os neurônios trafegam informações na ordem de milisegundos, transistores gastam apenas nanosegundos. Mas por que os processadores ainda não superaram o cérebro humano na resolução de problemas comuns para o cérebro, como por exemplo o reconhecimento de imagens. Ainda tomando como base as teorias descritas neste artigo, o cérebro apenas consulta a resposta na memória, não realiza os cálculos complexos que são efetuados pelos softwares.

Inteligência Artificial, Memória, Processamento de Sinais 5 Comentários

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)

Uso compulsivo de memória

As vezes escutamos afirmações do tipo: “Vazamentos de memória são comuns em linguagens baixo nível. Coisas do passado. Linguagens modernas estão livres desse pesadelo.” Quem acredita nisso também deve acreditar em coelhinho da Páscoa, Papai Noel e certamente em “almoço grátis”. Linguagens “modernas” que utilizam gerenciamento próprio do espaço de memória no processo (como Java e .Net) também podem produzir vazamentos de memória ou sofrer com o mau uso da memória. Claro que não tão frequentes quanto em C ou C++, mas essas linguagens também permitem a construção de sistemas ou componentes com um consumo de memória sempre crescente, contra a vontade do desenvolvedor.

Lembro-me de que nos longínquos anos 90, quando falavam de Java a performance era o ponto mais questionado. Com o passar do tempo e a evolução do hardware, esse ponto foi deixado de lado. Hoje o comentário sobre sistemas em Java mais comum é que “consomem muita memória”. Mas algumas vezes, isso apenas mascara para o cliente o verdadeiro problema: vazamento de memória.

Durante minhas experiências profissionais já vi soluções brilhantes (e outras nem tanto) para vazamentos de memória. Algumas específicas para uma ou outra arquitetura ou ambiente, outras genéricas (de uso geral). Fazendo uma analogia com o mundo palpável, vamos supor que um vazamento de memória seja uma torneira gotejando sobre um balde. Se o balde entornar, o cliente pode ficar muito bravo. Vamos então a alguns exemplos de soluções para nossa torneira:

  • Aumento de memória: No mundo das grandes corporações, a primeira e mais comum solução é aumentar o tamanho do balde! Isso é fácil, barato, e de rápida implementação e de resultado instantâneo: O que demorava 1 semana, agora demora 1 mês;
  • Restart da aplicação: Outra solução comum, quase tanto quanto a anterior nas grandes empresas. Durante a noite, quando geralmente o gotejar é mais lento, você pega o balde, corre e joga a água fora em um lugar apropriado. Um ponto importante é que tem que ser rápido o suficiente pra fazer o trabalho entre uma gota e outra. Caso contrário algumas gotas caem no chão. Mas o cliente pode nem perceber o piso molhado.
  • Bloquear o acesso ao módulo: se não for uma torneira útil, você pode simplesmente fechar o registro para esta tubulação. Se alguém precisar da torneira, que use a de outro lugar.
  • Liberação de memória logo após a alocação: Isso só é possível em alguns ambientes e sistemas (por exemplo, os feitos em C). É difícil de imaginar, mas existe! Trocamos o balde por cachorro, treinado, jeitoso e delicado (por exemplo um dog alemão) pra beber as gotas de água que goteja. O cão pode ficar ali durante horas. E funciona bem. Mas ele vai sair do lugar, pra realizar outras necessidades, ou porque deu vontade mesmo. Que a água vai pingar no chão vai, mas ninguém saberá exatamente quando nem quanto.
  • Resolver o vazamento de memória: Essa é a última solução. Muita gente acredita que a hora do bombeiro é cara, outros acham que a torneira já está muito velha mesmo, e a solução seria trocar todo o encanamento. As vezes a solução não compensa mesmo. Mas algumas vezes a torneira está vazando por um motivo simples : não foi fechada direito. Outros casos podem ser mais complicados: seu mecanismo interno está estragado, foi montada com peças de má qualidade ou foi montada com peças de boa qualidade, mas foi montada de forma errada.

Para resolver vazamentos ou mau uso de memória uma ferramenta de qualidade é indispensável. Depois de entender o fluxo de execução do sistema ou componente, a utilização de ferramentas de profiling nos dá o “mapa da mina”. Dentre as existentes, duas que merecem destaque são:

- YourKit: para sistemas desenvolvidos em Java e C#, uma ferramenta de grande utilidade é um profiler como o YourKit, já comentado em um post anterior. O YourKit possui um recurso excelente pra procurar por vazamentos de memória e mesmo analisar sua utilização após o start: é possível criar snapshots da memória do processo para uma posterior verificação. Sem degradação da performance do sistema, este recurso em algumas situações pode ser usado inclusive no ambiente de produção.

- Valgrind: é a ferramenta indicada para uso em sistemas desenvolvidos em C e C++. Com ele são detectados os pontos onde memória ou objetos alocados e “esquecidos” na memória, e também a distribuição do uso memória pelos objetos e módulos do sistema. Além de vazamentos de memória, é possível detectar um mal uso da memória do sistema. Mas o Valgrind é uma ferramenta pesada, impossível de ser utilizada em ambientes de produção.

Embora algumas vezes a correção do problema não é viável, sua identificação sempre é. Depois da compreensão do funcionamento de um módulo e o uso correto de ferramentas de análise de memória é possível identificar qualquer vazamento de memória. Mas qual decisão tomar com essa informação? Solucionar o problema, utilizar um “ajuste técnico de contorno” ou simplesmente deixar como está ? Isso já é trabalho da gerência.

Desenvolvimento, Memória 1 Comentário

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)