Swift para TensorFlow (en modo archivo)

Swift para TensorFlow fue un experimento en la plataforma de próxima generación para el aprendizaje automático, que incorpora las últimas investigaciones sobre aprendizaje automático, compiladores, programación diferenciable, diseño de sistemas y más. Fue archivado en febrero de 2021. Algunos logros importantes de este proyecto incluyen:

Este sitio no recibirá más actualizaciones. La documentación API y las descargas binarias seguirán siendo accesibles, así como las grabaciones de las reuniones de Open Design Review .

Rápido

Swift es un lenguaje de programación de propósito general de código abierto , que tiene una base de usuarios grande y en crecimiento. Elegimos Swift porque tiene un proceso de diseño de lenguaje abierto y por razones técnicas específicas que se detallan en el documento " Por qué Swift para TensorFlow ". Suponemos que la mayoría de los lectores no están familiarizados con él, por lo que abordaremos brevemente algunas cosas adicionales importantes aquí.

El desarrollo de Swift comenzó en 2010 y tenía como objetivo reunir las mejores prácticas en el diseño de lenguajes de programación en un solo sistema en lugar de buscar novedades académicas o propagar religiosamente metodologías de programación. Como resultado, admite el desarrollo de múltiples paradigmas (por ejemplo, funcional, programación orientada a objetos, genérico, procedimental, etc.), todo en un solo sistema, y ​​aporta muchos conceptos bien conocidos de lenguajes académicos (por ejemplo, coincidencia de patrones , tipos de datos algebraicos y clases de tipos). a la vanguardia. En lugar de alentar encarecidamente a los desarrolladores a reescribir todo su código en Swift, se centra pragmáticamente en la interoperabilidad con otros lenguajes, por ejemplo, permitiéndole importar directamente archivos de encabezado C y usarlos sin un FFI y (ahora) la capacidad de usar API de Python sin envoltorios. .

Swift tiene el audaz objetivo de abarcar desde la programación de sistemas de bajo nivel hasta el scripting de alto nivel, centrándose en que sea fácil de aprender y usar . Debido a que Swift debe ser fácil de aprender y usar, pero también poderoso, se basa en el principio de divulgación progresiva de la complejidad , que factoriza agresivamente el costo de la complejidad en las personas que se benefician de esa complejidad. La "sensación del lenguaje de secuencias de comandos" combinada con un alto rendimiento es muy útil para el aprendizaje automático.

Un último aspecto pertinente del diseño de Swift es que gran parte del lenguaje Swift en realidad se implementa en su biblioteca estándar. Los tipos "integrados" como Int y Bool son en realidad solo estructuras definidas en la biblioteca estándar que envuelven tipos y operaciones mágicas. Como tal, a veces bromeamos diciendo que Swift es simplemente "azúcar sintáctico para LLVM".

Hay muchas más cosas interesantes sobre Swift y una gran cantidad de contenido disponible en línea. Si está interesado en aprender más sobre los conceptos generales de programación Swift, aquí hay algunos enlaces para comenzar:

Una advertencia: Swift evolucionó rápidamente en sus primeros años, por lo que debes tener cuidado con todo lo anterior a Swift 3 (lanzado en 2016).

¿Por qué Swift para TensorFlow?

Swift para TensorFlow es una nueva forma de desarrollar modelos de aprendizaje automático. Le brinda el poder de TensorFlow directamente integrado en el lenguaje de programación Swift . Creemos que los paradigmas de aprendizaje automático son tan importantes que merecen soporte de lenguaje y compilador de primera clase .

Una primitiva fundamental en el aprendizaje automático es la optimización basada en gradientes: calcular derivadas de funciones para optimizar parámetros. Con Swift para TensorFlow, puedes diferenciar funciones fácilmente usando operadores diferenciales como gradient(of:) o diferenciarlas con respecto a un modelo completo llamando al método gradient(in:) . Estas API de diferenciación no solo están disponibles para conceptos relacionados con Tensor : están generalizadas para todos los tipos que se ajustan al protocolo Differentiable , incluidos los vectores Float , Double , SIMD y sus propias estructuras de datos.

// 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

Más allá de los derivados, el proyecto Swift para TensorFlow viene con una cadena de herramientas sofisticada para hacer que los usuarios sean más productivos. Puede ejecutar Swift de forma interactiva en un cuaderno Jupyter y obtener sugerencias útiles de autocompletar para ayudarle a explorar la enorme superficie API de una biblioteca moderna de aprendizaje profundo. ¡Puedes comenzar directamente en tu navegador en segundos !

Migrar a Swift para TensorFlow es realmente fácil gracias a la poderosa integración de Python de Swift. Puedes migrar incrementalmente tu código Python (o continuar usando tus bibliotecas Python favoritas), porque puedes llamar fácilmente a tu biblioteca Python favorita con una sintaxis 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!