Swift para TensorFlow (no modo de arquivamento)

Swift for TensorFlow foi um experimento na plataforma de próxima geração para aprendizado de máquina, incorporando as pesquisas mais recentes em aprendizado de máquina, compiladores, programação diferenciável, design de sistemas e muito mais. Foi arquivado em fevereiro de 2021. Algumas conquistas significativas deste projeto incluem:

Este site não receberá mais atualizações. A documentação da API e os downloads binários continuarão acessíveis, assim como as gravações das reuniões do Open Design Review .

Rápido

Swift é uma linguagem de programação de código aberto de uso geral, que possui uma base de usuários grande e crescente. Escolhemos o Swift porque ele possui um processo de design de linguagem aberta e por motivos técnicos específicos detalhados no documento " Por que Swift para TensorFlow ". Presumimos que a maioria dos leitores não esteja familiarizada com ele, por isso abordaremos brevemente algumas coisas adicionais importantes sobre ele aqui.

O desenvolvimento do Swift começou em 2010 e teve como objetivo reunir as melhores práticas em design de linguagens de programação em um sistema, em vez de tentar novidades acadêmicas ou propagar religiosamente metodologias de programação. Como resultado, ele suporta o desenvolvimento multiparadigma (por exemplo, funcional, OOP, genérico, processual, etc.) tudo em um único sistema, e traz muitos conceitos bem conhecidos de linguagens acadêmicas (por exemplo, correspondência de padrões , tipos de dados algébricos e classes de tipo). em primeiro plano. Em vez de encorajar fortemente os desenvolvedores a reescrever todo o seu código em Swift, ele se concentra pragmaticamente na interoperabilidade com outras linguagens, por exemplo, permitindo importar diretamente arquivos de cabeçalho C e usá-los sem um FFI e (agora) a capacidade de usar APIs Python sem wrappers .

Swift tem o objetivo audacioso de abranger desde a programação de sistemas de baixo nível até scripts de alto nível, com foco em ser fácil de aprender e usar . Como o Swift precisa ser fácil de aprender e usar, mas também poderoso, ele se baseia no princípio da divulgação progressiva da complexidade , que atribui agressivamente o custo da complexidade às pessoas que se beneficiam dessa complexidade. A "sensação de linguagem de script" combinada com alto desempenho é muito útil para aprendizado de máquina.

Um último aspecto pertinente do design do Swift é que grande parte da linguagem Swift é realmente implementada em sua biblioteca padrão. Tipos "construídos" como Int e Bool são, na verdade, apenas estruturas definidas na biblioteca padrão que envolvem tipos e operações mágicas. Como tal, às vezes brincamos que Swift é apenas "açúcar sintático para LLVM".

Há muito mais coisas legais sobre o Swift e uma tonelada de conteúdo disponível online. Se você estiver interessado em aprender mais sobre os conceitos gerais de programação em Swift, aqui estão alguns links para começar:

Um aviso: o Swift evoluiu rapidamente em seus primeiros anos, então você deve ter cuidado com qualquer coisa antes do Swift 3 (lançado em 2016).

Por que Swift para TensorFlow?

Swift for TensorFlow é uma nova maneira de desenvolver modelos de aprendizado de máquina. Ele oferece o poder do TensorFlow diretamente integrado à linguagem de programação Swift . Acreditamos que os paradigmas de aprendizado de máquina são tão importantes que merecem linguagem de primeira classe e suporte de compilador .

Uma primitiva fundamental no aprendizado de máquina é a otimização baseada em gradiente: computar derivadas de funções para otimizar parâmetros. Com o Swift para TensorFlow, você pode diferenciar funções facilmente usando operadores diferenciais como gradient(of:) ou diferenciar em relação a um modelo inteiro chamando o método gradient(in:) . Essas APIs de diferenciação não estão disponíveis apenas para conceitos relacionados Tensor — elas são generalizadas para todos os tipos que estão em conformidade com o protocolo Differentiable , incluindo Float , Double , vetores SIMD e suas próprias estruturas de dados.

// Custom differentiable type.
struct Model: Differentiable {
    var w: Float
    var b: Float
    func applied(to input: Float) -> Float {
        return w * input + b
    }
}

// Differentiate using `gradient(at:_:in:)`.
let model = Model(w: 4, b: 3)
let input: Float = 2
let (𝛁model, 𝛁input) = gradient(at: model, input) { model, input in
    model.applied(to: input)
}

print(𝛁model) // Model.TangentVector(w: 2.0, b: 1.0)
print(𝛁input) // 4.0

Além dos derivados, o projeto Swift for TensorFlow vem com um conjunto de ferramentas sofisticado para tornar os usuários mais produtivos. Você pode executar o Swift interativamente em um notebook Jupyter e obter sugestões úteis de preenchimento automático para ajudá-lo a explorar a enorme superfície de API de uma biblioteca moderna de aprendizado profundo. Você pode começar diretamente no seu navegador em segundos !

Migrar para Swift para TensorFlow é realmente fácil graças à poderosa integração Python do Swift. Você pode migrar gradativamente seu código Python (ou continuar a usar suas bibliotecas Python favoritas), porque você pode facilmente chamar sua biblioteca Python favorita com uma sintaxe familiar:

import TensorFlow
import Python

let np = Python.import("numpy")

let array = np.arange(100).reshape(10, 10)  // Create a 10x10 numpy array.
let tensor = Tensor<Float>(numpy: array)  // Seamless integration!