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.