Pergunta

Estou escrevendo código para uma rede neural e estou me perguntando se devo fazê -lo ou não. Na verdade, estou um pouco preocupado com o fato de que mesmo usar o dobro pode não exercer bons resultados e que eu possa ter que migrar meu código para uma linguagem mais eficiente, como o C ++. Eu li em uma pergunta aqui que o BigDecimal é 1000 vezes mais lento que o dobro? Isso é muito.

Por outro lado, vou trabalhar muito com números decimais e ter mais preciso seria sempre bom. Também não sei dizer se a precisão também pode causar problemas. Eu também não acho que nenhuma das implementações que eu já vi faça, então provavelmente não vou fazer isso. Embora às vezes a rede não se comporte como deveria; Seja um erro de precisão ou um problema com sua lógica, não tenho certeza.

Mas estou me perguntando, vocês só usam BigDecimal ao lidar com dinheiro? Algum pensamento sobre isso?

Foi útil?

Solução

Usando Java's double O tipo de dados para pesos em uma rede neural parece muito apropriado. É uma boa escolha para aplicações científicas e de engenharia.

As redes neurais são inerentemente aproximadas. A precisão de BigDecimal Seria sem sentido nessa aplicação, o impacto do desempenho de lado. reserva BigDecimal principalmente para aplicações financeiras.

Outras dicas

Eu uso números inteiros/longos ao lidar com dinheiro, porque usar qualquer tipo de representação decimal é absurdo. Definitivamente, você não deve usar duplas, e há algumas bibliotecas de manuseio de dinheiro por aí que você pode querer olhar.

Pelo que me lembro, no entanto, as bibliotecas de dinheiro são imaturas ou subdesenvolvidas.

Os números inteiros para valores inteiros e fracionários, combinados com a moeda, são o caminho a percorrer. Encontre uma biblioteca ou escreva o seu próprio.

Você absolutamente não deve usar números decimais de ponto flutuante para quantidades de ponto fixo - como moeda.

No passado, usei uma aula de dinheiro personalizada que apenas envolve uma instância BigDecimal - ela funcionou bem e não tem problemas.

Pessoas não Apenas use BigDecimal / BigInteger por dinheiro. Em vez disso, eles os usam em aplicativos que precisam de mais precisão do que está disponível usando double ou long.

Claro, usando BigDecimal e BigInteger tem o custo de operações aritméticas muito mais lentas. Por exemplo, grande adição de número é O(N) Onde N é o número de dígitos significativos no número e a multiplicação é O(N**2).

Então, a maneira de decidir se deve usar long / double Ou seus "grandes" análogos é analisar quanta precisão seu aplicativo realmente precisa. As aplicações de dinheiro realmente precisam ser capazes de representar valores sem perder um único centavo. Outras aplicações são igualmente sensíveis à precisão.

Mas, francamente, não acho que um aplicativo de rede neural precise de 13 dígitos decimais de precisão. A razão pela qual sua rede não está se comportando, pois provavelmente não tem nada a ver com precisão. IMO, é mais provável que as redes neurais "reais" nem sempre se comportem da maneira que deveriam.

Faça seus próprios benchmarks e decida com base nisso ... Não significa nada "o que as pessoas dizem".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top