Duas respostas curtas
A resposta curta de uma perspectiva teórica é que ...
Um gráfico computacional dinâmico é um sistema mutável representado como um gráfico direcionado de fluxo de dados entre operações. Pode ser visualizado como formas contendo texto conectado por setas, em que os vértices (formas) representam operações nos dados que fluem pelas bordas (setas).
Observe que esse gráfico define dependências no fluxo de dados, mas não necessariamente a ordem temporal da aplicação das operações, que pode se tornar ambígua na retenção de estado em vértices ou ciclos no gráfico sem um mecanismo adicional para especificar precedência temporal.
A resposta curta da perspectiva de desenvolvimento de aplicativos é que ...
Uma estrutura de Gráfico Computacional Dinâmico é um sistema de bibliotecas, interfaces e componentes que fornecem uma interface de tempo de execução flexível e programática que facilita a construção e modificação de sistemas conectando um conjunto de operações finito, mas extensível.
O framework PyTorch
PyTorch é a integração da estrutura do Torch com a linguagem Python e a estruturação de dados. A Torch compete com Theano, TensorFlow e outras estruturas dinâmicas de construção de sistemas computacionais.
--- Abordagens adicionais para a compreensão ---
Estruturas Computacionais Arbitrárias de Tensores Discretos Arbitrários
Um dos componentes que pode ser usado para construir um sistema computacional é um elemento projetado para ser interconectado para criar redes neurais. A disponibilidade destes suporta a construção de aprendizado profundo e a propagação de redes neurais. Uma grande variedade de outros sistemas envolvendo a montagem de componentes que trabalham com dados potencialmente multidimensionais em estruturas computacionais definidas arbitrariamente também pode ser construída.
Os dados podem ser valores escalares, como números de ponto flutuante, números inteiros ou seqüências de caracteres, ou agregações ortogonais desses, como vetores, matrizes, cubos ou hipercubos. As operações de generalização desses formulários de dados são tensores discretos e as estruturas criadas a partir da montagem das operações do tensor nos sistemas de trabalho são fluxos de dados.
Pontos de referência para entender o conceito de computação dinâmica
Os gráficos computacionais dinâmicos não são um conceito particularmente novo, embora o termo seja relativamente novo. O interesse em DCGs entre cientistas da computação não é tão novo quanto o termo Data Scientist. No entanto, a pergunta afirma corretamente que existem poucos recursos bem escritos disponíveis (além dos exemplos de código) dos quais se pode aprender o conceito geral em torno de sua emergência e uso.
Um possível ponto de referência para começar a entender os DCGs é o padrão de design de comando, que é um dos muitos padrões de design popularizados pelos proponentes do design orientado a objetos. O padrão de design do Comando considera operações como unidades de computação cujos detalhes estão ocultos nos objetos de comando que os acionam. O padrão de design do comando é frequentemente usado em conjunto com o padrão de design do intérprete.
No caso de DCGs, os padrões de projeto Composite e Facade também estão envolvidos para facilitar a definição de operações de tensores discretos plug-and-play que podem ser montados juntos em padrões para formar sistemas.
Essa combinação específica de padrões de design para formar sistemas é na verdade uma abstração de software que se assemelha amplamente à idéia radical que levou ao surgimento da arquitetura Von Neumann, central para a maioria dos computadores atualmente. A contribuição de Von Neumann para o surgimento do computador é a idéia de permitir que algoritmos arbitrários contendo lógica booleana, aritmética e ramificação sejam representados e armazenados como dados - um programa.
Outro precursor dos DCGs são os mecanismos de expressão. Os mecanismos de expressão podem ser tão simples quanto os aritméticos e tão complexos quanto aplicativos como o Mathematica. Um mecanismo de regras é um pouco como os DCGs, exceto que os mecanismos de regras são declarativos e as meta-regras dos mecanismos de regras operam nessas declarações.
Programas Manipulando Programas
O que eles têm em comum com os DCGs é que o fluxo de dados e operações a serem aplicados pode ser definido em tempo de execução. Como nos DCGs, algumas dessas bibliotecas e aplicativos de software têm APIs ou outros mecanismos para permitir que operações sejam aplicadas em detalhes funcionais. É essencialmente a idéia de um programa que permite a manipulação de outro programa.
Outro ponto de referência para entender esse princípio em um nível primitivo é a instrução switch-case disponível em algumas linguagens de computador. É uma estrutura de código-fonte na qual o programador expressa essencialmente: "Não temos certeza do que deve ser feito, mas o valor dessa variável informará o modelo de execução em tempo real o que fazer a partir de um conjunto de possibilidades".
A instrução switch-case é uma abstração que estende a idéia de adiar a decisão quanto à direção do cálculo até o tempo de execução. É a versão do software do que é feito dentro da unidade de controle de uma CPU contemporânea e uma extensão do conceito de adiar alguns detalhes do algoritmo. Uma tabela de functores (ponteiros de função) em C ou polimorfismo em C ++, Java ou Python são outros exemplos primitivos.
A computação dinâmica leva a abstração adiante. Eles adiam a maioria, senão toda a especificação de cálculos e os relacionamentos entre eles para executar o tempo. Essa generalização abrangente amplia as possibilidades de modificação funcional em tempo de execução.
Representação gráfica direcionada de computação
É esse o modelo dinâmico da computação. Agora, para a parte do gráfico.
Depois que se decide adiar a escolha das operações a serem executadas até o tempo de execução, é necessária uma estrutura para manter as operações, seus relacionamentos de dependência e talvez mapear parâmetros. Essa representação é mais do que uma árvore sintática (como uma árvore que representa a hierarquia do código-fonte). Ao contrário de um programa em linguagem assembly ou código de máquina, ele deve ser fácil e arbitrariamente mutável. Ele deve conter mais informações que um gráfico de fluxo de dados e muito mais que um mapa de memória. Como deve ser essa estrutura de dados que especifica a estrutura computacional?
Felizmente, qualquer algoritmo arbitrário, finito e limitado pode ser representado como um gráfico direcionado de dependências entre operações especificadas. Nesse gráfico, os vértices (geralmente representados como nós de várias formas quando exibidos) representam operações executadas nos dados e as bordas (geralmente representadas como setas quando exibidas) são representações digitais de informações originadas como resultado de alguma operação (ou entrada do sistema) e das quais outras operações (ou saída do sistema) dependem.
Lembre-se de que o gráfico direcionado não é um algoritmo (em que uma sequência precisa de operações é especificada) nem uma declaração (pois os dados podem ser armazenados explicitamente e os loops, ramificações, funções e módulos podem ser definidos e aninhados).
A maioria dessas estruturas e bibliotecas do Dynamic Computational Graph permite que os componentes façam cálculos na entrada do componente que suporta o aprendizado de máquina. Os vértices no gráfico direcionado podem ser simulações de neurônios para a construção de uma rede neural ou componentes que suportam cálculo diferencial. Essas estruturas apresentam possibilidades de construções que podem ser usadas para aprendizado profundo em um sentido mais generalizado.
No contexto da história do computador
Novamente, nada mencionado até agora é novo para a ciência da computação. O LISP permite que os esquemas computacionais sejam modificados por outros algoritmos. E dimensionalidade e numerocidade generalizada de entrada são incorporadas a várias interfaces e protocolos plug-and-play de longa data. A idéia de uma estrutura para a aprendizagem também remonta ao mesmo período de meados do século XX.
O que há de novo e ganhando popularidade é uma combinação específica de recursos integrados e o conjunto associado de terminologia, uma agregação da terminologia existente para cada um dos recursos, levando a uma base mais ampla de compreensão para quem já estuda e trabalha na indústria de software .
- Sabor contemporâneo (moderno) das interfaces API
- Orientação a objetos
- Suporte discreto do tensor
- A abstração de gráfico direcionado
- Interoperabilidade com idiomas e pacotes populares que suportam big data, mineração de dados, aprendizado de máquina e análise estatística
- Suporte para construção de redes neurais arbitrárias e sistemáticas
- A possibilidade de adaptação estrutural da rede neural dinâmica (que facilita a experimentação da plasticidade neural)
Muitas dessas estruturas suportam adaptabilidade à alteração da dimensionalidade da entrada (número de dimensões e o alcance de cada).
Semelhança com Árvores de Símbolos Abstratos em Compiladores
Um gráfico de dependência de entradas e saídas de operações também aparece dentro da árvore de símbolos abstratos (AST), que alguns dos compiladores mais progressivos constroem durante a interpretação da estrutura do código-fonte. O AST é então usado para gerar instruções do assembler ou instruções da máquina no processo de vinculação com bibliotecas e formação de um executável. O AST é um gráfico direcionado que representa a estrutura dos dados, operações executadas e o fluxo de controle especificado pelo código-fonte.
O fluxo de dados é simplesmente o conjunto de dependências entre operações, que devem ser inerentes ao AST para que o AST seja usado para criar instruções de execução no código do montador ou da máquina que segue precisamente o algoritmo especificado no código-fonte.
Estruturas de Dynamic Computational Graph, diferentemente de instruções de caso de switch ou modelos AST em compiladores, podem ser manipuladas em tempo real, otimizadas, ajustadas (como no caso de redes artificiais de plástico), invertidas, transformadas por tensores, dizimadas, modificadas para adicionar ou remover entropia, mutada de acordo com um conjunto de regras ou traduzida de outra forma em formas derivadas. Eles podem ser armazenados como arquivos ou fluxos e depois recuperados deles.
Esse é um conceito trivial para programadores do LISP ou para aqueles que entendem a natureza da recomendação de John von Neumann de armazenar especificações operacionais como dados. Nesse sentido posterior, um programa é um fluxo de dados para instruir, através de um compilador e sistema operacional, um sistema computacional dinâmico implementado em circuitos digitais VLSI.
Atingindo a dimensionalidade e a numerocidade adaptáveis
Na pergunta, está o comentário de que não se precisa: "Precisa ter um conjunto de dados - que todas as instâncias contidas nele tenham o mesmo número fixo de entradas". Essa afirmação não promove uma compreensão precisa. Existem maneiras mais claras de dizer o que é verdade sobre a adaptabilidade dos insumos.
A interface entre um DCG e outros componentes de um sistema geral deve ser definida, mas essas interfaces podem ter dimensionalidade ou numerocidade dinâmica incorporadas a eles. É uma questão de abstração.
Por exemplo, um tipo de objeto de tensor discreto apresenta uma interface de software específica, mas um tensor é um conceito matemático dinâmico em torno do qual uma interface comum pode ser usada. Um tensor discreto pode ser um escalar, um vetor, uma matriz, um cubo ou um hipercubo, e o intervalo de variáveis dependentes para cada dimensão pode ser variável.
Pode ser que a quantidade de nós em uma camada do sistema definida em um Gráfico Computacional Dinâmico possa ser uma função do número de entradas de um tipo específico e que também possa ser um cálculo adiado para o tempo de execução.
A estrutura pode ser programada para selecionar a estrutura da camada (uma extensão do paradigma da caixa de comutação novamente) ou calcular parâmetros que definem os tamanhos e a profundidade ou a ativação da estrutura. No entanto, esses recursos sofisticados não são o que qualifica a estrutura como uma estrutura de Gráfico Computacional Dinâmico.
O que qualifica uma estrutura para suportar gráficos computacionais dinâmicos?
Para se qualificar como uma estrutura de Gráfico Computacional Dinâmico, a estrutura deve meramente suportar o adiamento da determinação do algoritmo para o tempo de execução, abrindo assim a porta para uma infinidade de operações nas dependências computacionais e no fluxo de dados no tempo de execução. O básico das operações adiadas deve incluir a especificação, manipulação, execução e armazenamento dos gráficos direcionados que representam sistemas de operações.
Se a especificação do algoritmo NÃO for adiada até o tempo de execução, mas for compilada no executável projetado para um sistema operacional específico, apenas com a flexibilidade tradicional fornecida por linguagens de baixo nível, como if-then-else, switch-case, polimorfismo, matrizes de functors e strings de comprimento variável, é considerado um algoritmo estático.
Se as operações, as dependências entre eles, o fluxo de dados, a dimensionalidade dos dados no fluxo e a adaptabilidade do sistema à numerocidade e dimensionalidade de entrada são variáveis no tempo de execução, de forma a criar um sistema altamente adaptável, então o algoritmo é dinâmico dessa maneira.
Novamente, os programas LISP que operam em programas LISP, mecanismos de regras com recursos de meta-regra, mecanismos de expressão, bibliotecas de objetos tensores discretos e até padrões relativamente simples de design de comandos são todos dinâmicos em algum sentido, adiando algumas características para o tempo de execução. Os DCGs são flexíveis e abrangentes em seus recursos para oferecer suporte a construções computacionais arbitrárias de maneira a criar um ambiente rico para experimentação de aprendizado profundo e implementação de sistemas.
Quando usar gráficos computacionais dinâmicos
Os prós e contras dos DCGs são inteiramente específicos de problemas. Se você investigar os vários conceitos de programação dinâmica acima e outros que possam estar intimamente ligados a eles na literatura associada, ficará óbvio se você precisa de um Gráfico Computacional Dinâmico ou não.
Em geral, se você precisar representar um modelo de computação arbitrário e variável para facilitar a implementação do sistema de aprendizado profundo, sistema de manipulação matemática, sistema adaptativo ou outra construção de software flexível e complexa que mapeie bem o paradigma DCG, uma prova O conceito de conceito usando uma estrutura de Gráfico Dinâmico Computacional é um bom primeiro passo para definir sua arquitetura de software para a solução do problema.
Nem todos os softwares de aprendizado usam DCGs, mas geralmente são uma boa opção, quando a manipulação sistemática e possivelmente contínua de uma estrutura computacional arbitrária é um requisito de tempo de execução.
Em resumo, os gráficos de computação dinâmica podem resolver alguns problemas que os estáticos não podem ou são ineficientes por não permitirem o treinamento em lotes.
Para ser mais específico, o treinamento em rede neural moderna geralmente é feito em lotes , ou seja, processando mais de uma instância de dados por vez. Alguns pesquisadores escolhem tamanhos de lote como 32, 128, enquanto outros usam tamanhos de lote maiores que 10.000. O treinamento de instância única geralmente é muito lento porque não pode se beneficiar do paralelismo de hardware.
Por exemplo, no Processamento de linguagem natural, os pesquisadores querem treinar redes neurais com frases de diferentes comprimentos. Usando gráficos de computação estática, eles geralmente precisam preencher primeiro , ou seja, adicionar símbolos sem sentido ao início ou final de frases mais curtas para criar todas as frases do mesmo tamanho. Esta operação complica muito o treinamento (por exemplo, precisa de mascaramento, redefine as métricas de avaliação, desperdiça uma quantidade significativa de tempo de computação nesses símbolos preenchidos). Com um gráfico de computação dinâmico, o preenchimento não é mais necessário (ou apenas dentro de cada lote).
Um exemplo mais complicado seria (usar rede neural para) processar as sentenças com base em suas árvores de análise. Como cada sentença possui sua própria árvore de análise, cada uma delas requer um gráfico de computação diferente, o que significa que o treinamento com um gráfico de computação estática pode permitir apenas o treinamento de instância única. Um exemplo semelhante a este é as redes neurais recursivas .
fonte
Muitas redes neurais profundas têm um gráfico de fluxo de dados estático, o que significa aproximadamente que a estrutura de sua computação (seu gráfico de computação) permanece estável em relação a diferentes entradas. Isso é bom, pois podemos aproveitar esse recurso para obter desempenho, como por mini lote (processando várias entradas de uma só vez).
Mas algumas redes neurais podem ter um gráfico de computação diferente para cada entrada. Isso causa alguns problemas (dificuldades em lotes, a construção de gráficos é computacionalmente cara) e, portanto, essas redes são um pouco difíceis de usar.
O artigo que você vincula supera esse problema, propondo um método que pode agrupar vários gráficos de computação em um. Então, podemos fazer nossas técnicas usuais de NN.
Os benefícios são acelerações, o que incentiva os pesquisadores a explorar diferentes estruturas e a serem mais criativos, eu acho.
Isto está incorreto.
fonte
Os gráficos computacionais dinâmicos são simplesmente CGs modificados com um nível mais alto de abstração. A palavra 'Dinâmico' explica tudo: como os dados fluem pelo gráfico depende da estrutura de entrada, ou seja, a estrutura do DCG é mutável e não estática. Uma de suas aplicações importantes está nas redes neurais da PNL.
fonte