Executando verificação de segurança...
3

Que tal exploramos o SIMPLES?

Olá turma, este é de fato o meu primeiro post aqui (sem contar a respostas ao post do Filipe).

Eu estou com uma ideia a respeito de um modulo para a criação de RNA (rede neural artificial).

Esta ideia consiste em algo bobo, apenas replicar o simples, o próprio módulo.

A ideia

  • Criar um modulo para facilitar o uso de rede neural sem a necessidade de recursos excessivos.
  • Desnevolver novas maneiras de treinar a rede de forma diferente da convencional.
  • Elaborar toda a geração de novos indivíduos com base em AG (Algoritmo Genetico).

Oque já tenho pronto

  • O módulo de rede neural com algoritmo genético já documentado e com um projeto pronto.
  • Geração de indivíduos, genomas e pesos.
  • Instrução básica de uso.
  • Versões crua para quem está iniciando agora em javascript.

Conclusão

Eu peço encarecidamente por ajuda, a ajuda de todos.

Não para fazer por mim, pois a parte principal está feita, mas sim para me motivar, incentivar e idealizar melhor.

Estou fazendo tudo com base em meus conhecimentos e pesquisas e quanto mais conteúdo vocês me jogarem, melhor eu deixarei o modulo, afinal eu quero um modulo com oque parece ser imposivel... "ter menos custo computacional e ser mais eficiente".

Agradecimento

  • Obrigado pela atenção e apóio de vocês.
  • Obrigado Filipe Deschamps por ter esta plataforma.
  • Obrigado a internet por simplesmente existir.
Carregando publicação patrocinada...
3

Olá Fábio 💁🏻‍♂, é muito interessante o projecto, inclusive a proposta é muito benéfica, visto que a nossa maioria não tem recursos suficientes para poder fazer a execução de RNAs devido ao custo alto de processamento.

💁🏻‍♂ Com este projeto, acredito que será necessário ir ao mais baixo nível da programação, se quisermos fazer este aumento de performance.

1
3

Boa tarde Fábio!!

Obrigado pelo seu post, fico muito feliz em ver mais assuntos de machine learning por aqui!

Não sei ao certo seu nível no machine learning, então vou levar em consideração como se tivesse iniciando na área (não se ofenda se tiver experiência, por favor).

Eu vi que o seu objetivo para esse projeto é replicar um módulo de rede neural para algoritmo genética e, apesar de ter lido todo o post e ido no Github, não encontrei qual efetivamente é o objetivo do projeto, qual o problema de negócio você quer responder exatamente.

Segunda questão é:

É estritamente necessário usar rede neural?

Elas são naturalmente custosas e algoritmos supervisionados simples talvez já resolvam o seu problema e são mais interpretáveis.

Aguardo a sua resposta e agradeço novamente pelo post!

1

Obrigado pelo comentário GTEX.

A ideia deste projeto não é de faro o uso de rede neural, mas sim estudar e desnevolver métodos para melhorar o treinamento de redes, exatamente por ser algo custoso.

A idéia em si é simplesmente elaborar um modulo para dar visibilidade a quem quer começar na área, já que se você usar um Tensorflow por exemplo, terá que montar toda uma estrutura baseada em estudo.

Quando eu estava começando não achei conteúdo que de fato tivesse sentido mesmo sendo algo bobo.

No início eu tentava replicar testes como o cacheiro viajando e ping pong ppr exemplo, mas sempre dependendo de alguma ferramenta ou tendo que criar algo que não tinha aprendido ainda. (eu sei que fui muito afobado no início)

Então eu criei este modulo, justamente para que um amigo meu que não entende de rede neural, mas entende de javascript pudesse fazer os exatos testes que eu fiz.

Foi dai que surgiu a ideia de continuar este projeto, fazendo com que tenhamos treinamentos diferentes entende?

Eu tenho um projeto privado de estrutura de dados, onde os dados são todos lidos através de um plano cartesiano tridimensional e isso meio que reduz o consumo de memória.

Então eu pensei.... por que não tentar usar estes valores no meu modulo.

Por fim a idéia virou tentar achar novas formas de criar a rede e usar e treinar, diferente das já existentes.

Fugir da curva padrão em que já foram testadas e criar algo novo, como por exemplo um objetivo para existir um neurônio na rede e me determinada coluna, desativar e remover neurônios mortos com base em algun fato, minificar o uso do dataset ou até mesmo aumenta-lo com um teste mais precisos.

São coisas já testadas e estudadas, mas eu sinto que esta tudo virando mais do mesmo.

De fato não precisamos de uma rna para tudo, existe casoa específicos e na maioria das vezes qualquer classificador pode substitu-la, ainda mais uma perceptron.

Não sei se você já desenvolveu uma ia que detecta objetos, entendendo como funciona a lib (caso tenha usado, e se sim eu imagino que seja a OpenCV), basicamente tem a dataset e todos os filtros e tratamentos antes de passar os inputs e todas as redes neste formato seguem o mesmo conceito e são absurdamente custosas dependendo do que esta desnevolvendo.

A idéia em questão é buscar formas fora da caixa para desnevolver um treinamento de rede que não seja tão custoso, inicialmente eu pensei em treinar usando chunk ou desnevolver um calculo para não gerar aleatoriamente os primeiros pesos.

Enfim, isso tudo não é algo muito nescessário, apenas vendo uma forma de ajudar quem esta começando, empurrando toda a dificuldade que eu tive para o final deste aprendizado e também para descobrir pessoas engenhosas que consiga deixar uma rede tão performática quanto as atuais.

Por favor, não entenda isso como uma substituição dos módulos já existentes, pois eles são muito bons e tem suas finalidades.

Ficou claro ? gostaria fortemente da sua opinião 😌

2

Obrigado pela resposta FabioSmuu!

Entendi o que você deseja fazer, é algo parecido o que o TabNews quer fazer, novas maneiras de a gente aprender de coisas já existentes 😄

No momento as redes neurais não são muito o meu campo de trabalho, mas desejo que tenha sucesso nesse projeto!!

PS. Só um ponto sobre o que você falou, desenvolver um cálculo para não gerar aleatoriamente os primeiros pesos parece uma armadilha, porque a aleatoriedade nos pesos é necessária para não ter tendência de treinamento. Para evitar ser custoso, tem que trabalhar na parte do treinamento.

1

Isso mesmo, tem de trabalhar na parte do treinamento mesmo.

Esobre os pesos não serem aleatórios é exatamente esta sensação de armadilha que fazem não serem explorados, já que algo "matemáticamente" criado pode converger a um ótimo local, mas eu não me refiro a isso e sim em saber gerar os valores aleatórios de forma em que a própria rede demore mais tempo para associa-los durante o crossover por exemplo.

E acho que nesta parte que deve ocorrer o maior consumo e não durante o treinamento, oque não ocorre na prática.

Obrigado pela atenção, apóio e por entender a ideia e conceito

1

Estamos juntos FabioSmuu!!

A gente tem que criar esse conteúdo de ML mesmo na comunidade brasileira!

Sobre a parte de convergir em menos tempo por não ter valores aleatórios, não acredito que seja assim porque o backpropagation geralmente utiliza algoritmos que punem valores mais discrepantes para toda a rede.

O dropout vai servir para corrigir ainda mais esses valores discrepantes e não ocorrer um possível overfit.

2

Sim, mas ai você esta trabalhando encima de conceitos já existentes.

Isso não se aplicaria se os valores fossem gerados de forma matemática.

A idéia neste caso seria criar uma metodologia viável para este tipo de comportamento, mas sim você esta certo a respeito de valores randomicos, mas acredito que isso não daria toda a liberdade e controle numa rede com um conceito novo.

mesmo assim é sempre bom termos ambos os pensamentos soltos, afinal, tudo é conteúdo 😌

1

Sim sim, é verdade!

Sobre os pesos iniciarem aleatórios ou partirem de pesos avaliados, já houve uma tentativa, porém não chegava na solução ideal.

Não me lembro exatamente o artigo, mas vale dar uma olhada.

1

Você consegue deixar Módulo mais rápido se ele for ad hoc. Mas parece que você deseja uma solução bem generalista.

Outro problema; usar JS para fazer o treinamento de Redes Neurais é como "martelar parafusos" (Akita).
Pode usar C++ para o treinamento, exportar os pesos, e então usar o JS para fazer o Forward.

Quanto à inicialização; que você gostaria de descartar a aleatoriedade, ainda não existe um método que seja melhor, você terá que ir muito fundo nas pesquisas, provavelmente usando gradientes nos seus cálculos...

Eu já fiz o seguinte (mas não fugindo da aleatoriedade):

  • supondo que seja uma rede com 2 neurônios e 2 pesos,
  • suponto que foram inicializados com ,025 e -,01

Neste caso eu crio 4 redes (sendo n o número de pesos; 2^n Redes); com os seguintes pesos:

RNW1W2
RN1,025-,01
RN2,025,01
RN3-,025-,01
RN4-,025,01

Executo o treinamento de todas elas em paralelo.
Uma delas vai convergir mais rápido para o mínimo global.

E uma grande observação aqui:

às vezes fazer isso é muito interessante para as Redes que ficam muito travadas em um mínimo local;
às vezes não, só dificulta o problema.

1

Gostei muito deste comentário.

Eu concordo que js não é a melhor linguagem, já pensei em fazer em c++ ou R, mas cai na questão de que pessoas novas em programação consiga de fato entender.

Outro ponto é, js ela é boa para este tipo de desnevolvimento, só não é a melhor, mas se os estudos melhorarem o desnevolvimento, então seria super viável usa-la.

E por fim, fica viável evitar merge, mas mesmo assim não é a melhor linguagem e estou ciente disso 😅

Agora a ideia de usar esta estratégia de aleatoriedade principalmente para posições travadas semelhantes ao ótimo local, vou testar e tentar entender melhor o funcionamento da estratégia, muito obrigado.

Eu estou desenvolvendo uma função de "matar neurônios inativos", por meus testes a rede até que fica com menos processo, ainda mais se você colocar em workers etc...

Também estou vendo sobre criar pooling de forma conciente e treinar oa neurônios em si e não camadas, pois assim, fica fácil saber a função dos neurônios ao invés das camadas, mas é um processo muito mais trabalhoso e não reduz o custo do treino só o torna mais maleável.

1
1

É uma boa.

Matar neurônios pode ser útil para reduzir um pouco do processamento.

Também estou vendo a respeito se criar camadas separadas fora da rede e treinar para coisas bobas e montar um preset para transferlearning.

Alem de pensar num solução para trabalhar com as informações em chunk e/ou quadtree, juntando numa especia de "plano cartesiano tridimensional".

A propósito, obrigado pela sugestão do XOR 😌