Aí vai...

-----------------------------------------------------------------------

3. RECONHECIMENTO
As técnicas discutidas até aqui nos permitem extrair de uma palavra
falada uma série de informações que a caracterizam. A primeira idéia que
poderia ser pensada para fazer o reconhecimento propriamente dito seria
simples: comparar as informações ex-traídas de uma palavra falada com as
de um banco de dados que contenha as informa-ções das palavras que
deverão ser reconhecidas pelo sistema.
Na prática, porém, esta solução apresenta-se inviável, pois, como uma
palavra nunca é pronunciada da mesma forma, a palavra falada jamais
seria encontrada no ban-co de dados. Problemas como este exigem uma
solução mais versátil, capaz de adaptar-se a todas as variações
possíveis na pronúncia. Algoritmos voltados à inteligência artifi-cial
visam exatamente este tipo de problema.
3.1. Inteligência artificial
Os processadores utilizados atualmente são muito diferentes do cérebro
humano. Eles podem pode ser excelentes para a resolução de problemas
lógicos ou matemáticos, mas deixam muito a desejar quando o problema
envolve conceitos abstratos. Os estudos de inteligência artificial
buscam dar às máquinas a capacidade de trabalhar de uma for-ma mais
semelhante ao cérebro humano.
Neste sentido, duas técnicas ganharam grande destaque nas duas últimas
déca-das: lógica fuzzy e redes neurais. Ambas buscam inspiração no
cérebro humano; a pri-meira procura imitar a forma inexata com que ele
percebe as informações enquanto a segunda, busca inspiração na sua
construção física.
Segundo a literatura consultada, redes neurais têm sido utilizadas com
grande sucesso para problemas envolvendo classificação e/ou
reconhecimento de padrões. Como o reconhecimento de voz pode ser
considerado como tal, optamos pela utilização de redes neurais para
fazer o reconhecimento.
3.2. Redes neurais
Quando o cérebro humano começou a ser desvendado, descobriu-se que as
cé-lulas que o formam, os neurônios, são elementos muito simples,
incapazes de realizar tarefas complexas. Logo percebeu-se que o cérebro
não é um único, grande e poderoso processador, mas sim um conjunto de
bilhões de processadores muito simples traba-lhando simultaneamente.
Pesquisadores das áreas de informática e eletrônica perceberam que
poderiam utilizar uma estrutura semelhante para criar sistemas com
algumas das características do cérebro. Desta forma, iniciaram-se
pesquisas mais detalhadas sobre os neurônios e de formas de
representá-lo matematicamente.
3.2.1. O neurônio
Como já foi comentado, uma rede neural busca inspiração na estrutura do
cére-bro. A unidade básica de nosso cérebro, o neurônio, apresenta uma
região onde infor-mações são processadas (o soma), algumas entradas (os
dentritos) e uma saída (o axô-nio). Os impulsos elétricos recebidos nos
dentritos são processados pelo soma e o re-sultado deste processamento é
colocado no axônio.
O modelo de neurônio no qual se baseiam as redes neurais possui uma
estrutura idêntica. Basicamente, a ativação (saída) de um neurônio
artificial é uma função da soma ponderada de suas entradas:
S = f ( E1 * P1 + E2 * P2 + E3 * P3 ) , onde S é a saída, Ex as entradas
e Px os pesos das somas.
Figura 3.1 - Esquema de um neurônio artificial
A função f, utilizada para obter a saída do neurônio, é chamada de
função de ati-vação. As funções de ativação mais utilizadas são funções
do tipo sigmoidal (com for-ma de S). A mais utilizada de todas é a
função logística:  .
Figura 3.2 - A função logística
A maior vantagem desta função é sua derivada, facilmente encontrada:

A derivada da função de ativação será necessária no processo de
treinamento da rede neural, discutido adiante.
É interessante observar que um único neurônio não é capaz de resolver
nenhum problema prático. Porém, muitos neurônios adequadamente
conectados e com os pesos das conexões devidamente ajustados são capazes
de resolver complexos problemas não-determinísticos. Quanto maior a
complexidade do problema a ser resolvido, maior será o número de
neurônios utilizados; para se ter uma idéia, o cérebro humano é formado
por cerca de 100 bilhões de neurônios e o número de conexões entre estes
neurônios está na casa das dezenas de trilhões.
3.2.2. Redes feedforward
É possível conectar os neurônios de uma rede neural de modos variados,
dando origem a diversas topologias. A topologia mais utilizada
atualmente em problemas prá-ticos é a feedforward, que pode ser
implementada em processadores comuns e, compa-rando-se com outras
topologias, não exige muita memória. Uma rede deste tipo está
representada na figura 3.3.
Figura 3.3 - Rede neural feedforward
Uma rede neural feedforward é composta de algumas camadas. Cada neurônio
de uma camada está conectado a todos os neurônios das camadas
adjacentes. É impor-tante destacar que a camada de entrada, na verdade,
não é formada por neurônios reais, pois eles não realizam nenhum
processamento; simplesmente distribuem os valores das entradas da rede
para os neurônios da primeira camada oculta.
Uma rede neural deste tipo, depois de pronta, é capaz de associar uma
série de valores que são colocados em suas entradas a uma determinada
saída. Ela não se trata, porém, simplesmente de uma memória, pois tem a
capacidade da generalização; ela pode encontrar respostas corretas mesmo
quando os dados disponíveis para as entradas estão incompletos ou
danificados ou mesmo quando a relação entre entrada e saída não é
concreta. Sabe-se, por exemplo, que há empresas utilizando redes neurais
para previ-são financeira: nas entradas são colocados dados sobre
diversos indicadores econômicos e na saída obtém-se informações como a
tendência das bolsas valores para o próximo dia.
O grande problema para a utilização de redes neurais têm sido encontrar
regras que permitam determinar o valor que os pesos das conexões devem
ter para que a rede neural realize a função desejada. O processo pelo
qual os pesos de uma rede neural são determinados é conhecido por
treinamento.
3.2.3. Treinamento
O treinamento de redes feedforward é do tipo supervisionado. Neste tipo
de trei-namento é preciso possuir um conjunto de dados para treinamento,
ou seja, uma série de pares de entradas e saídas desejadas. As entradas
são apresentadas à rede e seus pesos são alterados de modo que a saída
se aproxime da saída desejada. Pode-se dizer que a rede neural aprende a
fazer seu trabalho observando uma série de exemplos que lhe são
exibidos.
Para alterar os pesos de forma adequada é necessária uma regra. A regra
de trei-namento mais utilizada para o treinamento de redes neurais
feedforward é a Error Backpropagation (retropropagação de erros). A
idéia deste algoritmo é atualizar os pe-sos utilizando as derivadas dos
erros em relação aos pesos. O estudo destas derivadas foi publicado por
Rumelhart e McClelland em 1986 e seus resultados estão descritos a
seguir.
Para uma conexão do neurônio j da camada de saída ao neurônio i da
camada oculta anterior, as seguintes equações são válidas:

Onde spj é a soma ponderada que chega ao neurônio j da camada de saída,
dj é a saída desejada para o este mesmo neurônio j, oj é a saída ali
obtida e oi é a saída do neurônio i da camada que antecede a camada de
saída.
Para pesos que "chegam" às camadas ocultas o cálculo é um pouco mais
com-plexo, pois envolve os "deltas" da próxima camada. Considerando spj
a soma ponderada chegando ao neurônio j da camada oculta em questão, dk
os "deltas" da próxima camada e Pkj o peso do neurônio k da camada
anterior ao neurônio j da camada em questão:

O processo de treinamento é iterativo. Cada vez que um par de "entrada /
saída desejada" é apresentado à rede neural, as derivadas são
recalculadas e os pesos são mo-dificados no sentido inverso desta
derivada, de modo a reduzir o peso. Isto é repetido para todos os
exemplos de treinamento, tantas vezes quantas forem necessárias para que
o erro fique dentro de limites aceitáveis. A figura 3.4 mostra a curva
típica da redução do erro durante o treinamento de uma rede neural
feedforward. Ela foi obtida a partir do treinamento de uma rede neural
simples.
Figura 3.4 - Treinamento de uma rede neural
3.2.4. Projetando uma rede neural
Criar uma rede neural para a resolução de um problema é uma tarefa que
exige atenção quanto a alguns detalhes. O primeiro deles é a definição
da sua forma, quantas camadas ela deve possuir e quais devem ser seus
tamanhos. Teoricamente, qualquer problema pode ser resolvido por uma
rede neural feedforward com duas camadas ocul-tas. Na prática, o mais
comum é utilizar apenas uma camada oculta, que é suficiente na absoluta
maioria dos casos.
A determinação do tamanho das camadas de entrada e de saída não é
problemá-tica, já que eles têm uma relação direta com o formato dos
dados que utilizaremos nas entradas e os que desejamos obter nas saídas.
Determinar o tamanho da camada oculta é, segundo diversos autores, um
processo de tentativa e erro. Sabe-se que se ela for muito pequena não
terá poder de processamento suficiente para resolver o problema; por
outro lado, se for muito grande, perderá sua capacidade de generalização
e atuará como uma memória.
Também é preciso ter em mente que o conjunto de exemplos utilizados no
trei-namento é crítico. Ele deve conter exemplos que representem  o
maior número de casos possíveis, para que o sistema seja capaz de
"aprender" a resolver o problema nas mais diversas situações.