Você está em uma entrevista para Engenheiro de ML na Tesla. Entrevistador: Precisamos implantar uma rede neural no hardware de borda do veículo, mas ela não cabe na memória. Como você lidaria com isso? Você: Vou usar destilação de conhecimento para treinar um modelo menor. Entrevista encerrada. Aqui está o que você perdeu:
A destilação de conhecimento exige semanas de computação, porque essencialmente você está treinando um novo modelo. Mas a solução já está dentro da sua rede treinada. A maioria dos neurônios é um peso morto – consome memória, mas mal contribui para as previsões. Vamos ver como identificá-los!
Aqui estão os passos: Passo 1) Treine a rede neural como de costume. Passo 2) Passe o conjunto de validação pela rede treinada e, para cada neurônio em camadas ocultas, calcule: - A ativação média - A variação das ativações (se as ativações podem ser -ve) Verifique isso👇
Etapa 3) Podar neurônios que têm uma média de ativação e variância próximas de zero, pois têm pouco impacto na saída do modelo. O ideal é plotar o desempenho em vários limites de remoção para selecionar o modelo que se ajusta às suas compensações de tamanho versus precisão. Verifique isso 👇
Vejamos o código. Começamos definindo uma rede neural simples e a treinamos. Como calcularemos as ativações no nível do neurônio posteriormente para poda, retornamos todas as ativações intermediárias na passagem para frente. Verifique isso👇
Em seguida, definimos duas listas com três elementos: - Um armazenará a média de ativações - Outro armazenará std dev de ativações Passamos o conjunto de validação por meio de nosso modelo para calcular essas estatísticas para cada camada oculta. Verifique isso 👇
Neste ponto, vamos criar um gráfico de distribuição de estatísticas em nível de neurônio que geramos acima. Conforme descrito abaixo, as ativações médias da maioria dos neurônios e seu desenvolvimento padrão são fortemente distribuídos em torno de valores próximos de zero. Vamos tentar podá-los a seguir.
Para poda, iteramos em uma lista de limites e: - Crie uma nova rede e transfira pesos que ultrapassem o limite. - Avalie a nova rede e calcule o total de parâmetros. - Anexe os resultados a uma lista. Verifique isso 👇
Esta tabela compara a precisão e a redução de tamanho do modelo podado em vários limites em relação ao modelo original. Em média = 0,1 e std-dev = 0,4: - A precisão do modelo cai 0,08%. - O tamanho do modelo reduz em 62%. Essa é uma grande redução. Verifique isso 👇
Aqui está outro resultado interessante. Em média = 0,5 e std-dev = 1: - A precisão do modelo cai 0,5%. - O tamanho do modelo é reduzido em 74%. Então, essencialmente, obtemos um desempenho quase semelhante para 1/4 dos parâmetros. Verifique isso 👇
Claro, há uma troca entre precisão e tamanho. À medida que reduzimos o tamanho, sua precisão cai (confira o vídeo). Mas, na maioria dos casos, a precisão não é a única métrica que otimizamos. Em vez disso, várias métricas operacionais, como eficiência, memória, etc., são os principais fatores.
384