Google I / O là một kết quả hoàn hảo! Cập nhật các phiên TensorFlow Xem phiên

Học tập liên kết

Tổng quat

Tài liệu này giới thiệu các giao diện hỗ trợ các tác vụ học tập liên kết, chẳng hạn như đào tạo hoặc đánh giá liên kết với các mô hình học máy hiện có được triển khai trong TensorFlow. Khi thiết kế các giao diện này, mục tiêu chính của chúng tôi là làm cho nó có thể thử nghiệm với học liên kết mà không yêu cầu kiến ​​thức về cách hoạt động của nó và đánh giá các thuật toán học liên kết đã triển khai trên nhiều mô hình và dữ liệu hiện có. Chúng tôi khuyến khích bạn đóng góp lại cho nền tảng. TFF đã được thiết kế với tính đến khả năng mở rộng và khả năng kết hợp, và chúng tôi hoan nghênh những đóng góp; chúng tôi rất vui khi thấy bạn nghĩ ra gì!

Các giao diện được cung cấp bởi lớp này bao gồm ba phần chính sau:

  • Mô hình . Các lớp và chức năng trợ giúp cho phép bạn gói các mô hình hiện có của mình để sử dụng với TFF. Việc gói một mô hình có thể đơn giản như việc gọi một hàm gói duy nhất (ví dụ: tff.learning.from_keras_model ) hoặc xác định một lớp con của giao diện tff.learning.Model để có thể tùy chỉnh đầy đủ.

  • Các nhà xây dựng tính toán liên bang . Chức năng trợ giúp xây dựng các phép tính liên hợp để đào tạo hoặc đánh giá, sử dụng các mô hình hiện có của bạn.

  • Bộ dữ liệu . Bộ sưu tập dữ liệu đóng hộp mà bạn có thể tải xuống và truy cập bằng Python để sử dụng trong việc mô phỏng các tình huống học tập liên kết. Mặc dù học liên kết được thiết kế để sử dụng với dữ liệu phi tập trung không thể tải xuống đơn giản tại một vị trí tập trung, nhưng ở giai đoạn nghiên cứu và phát triển, việc tiến hành các thử nghiệm ban đầu thường thuận tiện bằng cách sử dụng dữ liệu có thể tải xuống và thao tác cục bộ, đặc biệt là đối với các nhà phát triển có thể mới đối với cách tiếp cận.

Các giao diện này được định nghĩa chủ yếu trong không gian tên tff.learning , ngoại trừ các tập dữ liệu nghiên cứu và các khả năng liên quan đến mô phỏng khác đã được nhóm trong tff.simulation . Lớp này được thực hiện bằng cách sử dụng các giao diện cấp thấp hơn được cung cấp bởi Federated Core (FC) , nó cũng cung cấp một môi trường thời gian chạy.

Trước khi tiếp tục, chúng tôi khuyên bạn trước tiên nên xem lại các hướng dẫn về phân loại hình ảnhtạo văn bản , vì chúng giới thiệu hầu hết các khái niệm được mô tả ở đây bằng các ví dụ cụ thể. Nếu bạn quan tâm đến việc tìm hiểu thêm về cách TFF hoạt động, bạn có thể muốn đọc lướt qua hướng dẫn thuật toán tùy chỉnh dưới dạng giới thiệu về các giao diện cấp thấp hơn mà chúng tôi sử dụng để thể hiện logic của các phép tính liên hợp và để nghiên cứu việc triển khai hiện tại của giao diện tff.learning .

Mô hình

Các giả định về kiến ​​trúc

Serialization

TFF nhằm mục đích hỗ trợ nhiều kịch bản học phân tán khác nhau trong đó mã mô hình học máy mà bạn viết có thể đang thực thi trên một số lượng lớn các máy khách không đồng nhất với các khả năng đa dạng. Mặc dù ở một đầu của phổ, trong một số ứng dụng, các máy khách đó có thể là máy chủ cơ sở dữ liệu mạnh mẽ, nhiều cách sử dụng quan trọng mà nền tảng của chúng tôi dự định hỗ trợ liên quan đến các thiết bị di động và nhúng với tài nguyên hạn chế. Chúng tôi không thể giả định rằng các thiết bị này có khả năng lưu trữ thời gian chạy Python; điều duy nhất chúng ta có thể giả định tại thời điểm này là chúng có khả năng lưu trữ thời gian chạy TensorFlow cục bộ. Do đó, một giả định kiến ​​trúc cơ bản mà chúng tôi đưa ra trong TFF là mã mô hình của bạn phải có thể tuần tự hóa dưới dạng đồ thị TensorFlow.

Bạn vẫn có thể (và nên) phát triển mã TF của mình theo các phương pháp hay nhất mới nhất như sử dụng chế độ háo hức. Tuy nhiên, mã cuối cùng phải có thể tuần tự hóa (ví dụ: có thể được bao bọc như một tf.function cho mã chế độ háo hức). Điều này đảm bảo rằng mọi trạng thái Python hoặc luồng điều khiển cần thiết tại thời điểm thực thi đều có thể được tuần tự hóa (có thể với sự trợ giúp của Autograph ).

Hiện tại, TensorFlow không hỗ trợ đầy đủ tuần tự hóa và giải mã TensorFlow ở chế độ háo hức. Do đó, tuần tự hóa trong TFF hiện tuân theo mẫu TF 1.0, trong đó tất cả mã phải được xây dựng bên trong tf.Graph mà TFF điều khiển. Điều này có nghĩa là hiện tại TFF không thể sử dụng một mô hình đã được xây dựng; thay vào đó, logic định nghĩa mô hình được đóng gói trong một hàm no-arg trả về một tff.learning.Model . Hàm này sau đó được gọi bởi TFF để đảm bảo tất cả các thành phần của mô hình được tuần tự hóa. Ngoài ra, là một môi trường được đánh máy mạnh, TFF sẽ yêu cầu một chút siêu dữ liệu bổ sung, chẳng hạn như đặc điểm kỹ thuật của loại đầu vào mô hình của bạn.

Tổng hợp

Chúng tôi đặc biệt khuyên hầu hết người dùng nên xây dựng các mô hình bằng Keras, hãy xem phần Bộ chuyển đổi cho Keras bên dưới. Các trình bao bọc này xử lý việc tổng hợp các bản cập nhật mô hình cũng như bất kỳ chỉ số nào được xác định cho mô hình một cách tự động. Tuy nhiên, vẫn có thể hữu ích khi hiểu cách tổng hợp được xử lý cho một tff.learning.Model chung.

Luôn có ít nhất hai lớp tổng hợp trong học liên kết: tập hợp cục bộ trên thiết bị và tập hợp trên nhiều thiết bị (hoặc liên kết):

  • Tổng hợp cục bộ . Mức độ tổng hợp này đề cập đến sự tổng hợp trên nhiều lô ví dụ do một khách hàng cá nhân sở hữu. Nó áp dụng cho cả tham số mô hình (biến), tiếp tục phát triển tuần tự khi mô hình được đào tạo cục bộ, cũng như thống kê bạn tính toán (chẳng hạn như mất mát trung bình, độ chính xác và các số liệu khác), mà mô hình của bạn sẽ cập nhật lại cục bộ vì nó lặp lại trên từng luồng dữ liệu cục bộ của từng khách hàng.

    Thực hiện tổng hợp ở cấp độ này là trách nhiệm của mã mô hình của bạn và được thực hiện bằng cách sử dụng các cấu trúc TensorFlow tiêu chuẩn.

    Cấu trúc chung của quá trình xử lý như sau:

    • Đầu tiên, mô hình xây dựng tf.Variable s để giữ các tổng hợp, chẳng hạn như số lô hoặc số lượng ví dụ được xử lý, tổng tổn thất theo lô hoặc theo từng ví dụ, v.v.

    • TFF gọi phương thức forward_pass trên Model của bạn nhiều lần, tuần tự qua các lô dữ liệu khách tiếp theo, cho phép bạn cập nhật các biến chứa các tổng hợp khác nhau như một tác dụng phụ.

    • Cuối cùng, TFF gọi phương thức report_local_unfinalized_metrics trên Mô hình của bạn để cho phép mô hình của bạn biên dịch tất cả các thống kê tóm tắt mà nó thu thập được thành một tập hợp số liệu nhỏ gọn để khách hàng xuất. Đây là nơi mã mô hình của bạn, chẳng hạn, có thể chia tổng số lỗ cho số lượng ví dụ được xử lý để xuất mức lỗ trung bình, v.v.

  • Liên hợp tổng hợp . Mức độ tổng hợp này đề cập đến sự tổng hợp trên nhiều máy khách (thiết bị) trong hệ thống. Một lần nữa, nó áp dụng cho cả các tham số mô hình (biến), đang được tính trung bình trên các máy khách, cũng như các số liệu mà mô hình của bạn đã xuất do kết quả tổng hợp cục bộ.

    Thực hiện tổng hợp ở cấp độ này là trách nhiệm của TFF. Tuy nhiên, với tư cách là người tạo mô hình, bạn có thể kiểm soát quá trình này (thông tin thêm về điều này bên dưới).

    Cấu trúc chung của quá trình xử lý như sau:

    • Mô hình ban đầu và bất kỳ tham số nào được yêu cầu để đào tạo, được máy chủ phân phối tới một nhóm nhỏ khách hàng sẽ tham gia vào một vòng đào tạo hoặc đánh giá.

    • Trên mỗi máy khách, một cách độc lập và song song, mã mô hình của bạn được gọi lặp đi lặp lại trên một luồng các lô dữ liệu cục bộ để tạo ra một tập hợp các tham số mô hình mới (khi đào tạo) và một tập hợp các chỉ số cục bộ mới, như được mô tả ở trên (đây là tổng hợp).

    • TFF chạy một giao thức tổng hợp phân tán để tích lũy và tổng hợp các thông số mô hình và các chỉ số được xuất cục bộ trên toàn hệ thống. Logic này được thể hiện theo cách khai báo bằng cách sử dụng ngôn ngữ tính toán liên hợp của riêng TFF (không phải trong TensorFlow). Xem hướng dẫn thuật toán tùy chỉnh để biết thêm về API tổng hợp.

Giao diện trừu tượng

Giao diện siêu dữ liệu + phương thức khởi tạo cơ bản này được đại diện bởi interface tff.learning.Model , như sau:

  • Các phương thức constructor, forward_passreport_local_unfinalized_metrics phải tạo các biến mô hình, chuyển tiếp và thống kê mà bạn muốn báo cáo, tương ứng. TensorFlow được xây dựng bằng các phương pháp đó phải có thể tuần tự hóa, như đã thảo luận ở trên.

  • Thuộc tính input_spec , cũng như 3 thuộc tính trả về tập hợp con của các biến địa phương có thể đào tạo, không thể đào tạo và địa phương đại diện cho siêu dữ liệu. TFF sử dụng thông tin này để xác định cách kết nối các phần của mô hình của bạn với các thuật toán tối ưu hóa được liên kết và xác định các chữ ký kiểu nội bộ để hỗ trợ xác minh tính đúng đắn của hệ thống đã xây dựng (để mô hình của bạn không thể được khởi tạo qua dữ liệu không khớp với những gì mô hình được thiết kế để tiêu dùng).

Ngoài ra, giao diện trừu tượng tff.learning.Model hiển thị thuộc tính metric_finalizers nhận các giá trị chưa được hoàn thiện của chỉ số (được trả về bởi report_local_unfinalized_metrics() ) và trả về các giá trị chỉ số đã hoàn thiện. Phương metric_finalizersreport_local_unfinalized_metrics() sẽ được sử dụng cùng nhau để tạo bộ tổng hợp chỉ số giữa các khách hàng khi xác định các quy trình đào tạo liên kết hoặc tính toán đánh giá. Ví dụ: một trình tổng hợp tff.learning.metrics.sum_then_finalize đơn giản trước tiên sẽ tính tổng các giá trị chỉ số chưa được hoàn thiện từ các máy khách, sau đó gọi các hàm của bộ hoàn thiện tại máy chủ.

Bạn có thể tìm thấy các ví dụ về cách xác định tff.learning.Model tùy chỉnh của riêng bạn trong phần thứ hai của hướng dẫn phân loại hình ảnh của chúng tôi, cũng như trong các mô hình mẫu mà chúng tôi sử dụng để thử nghiệm trong model_examples.py .

Công cụ chuyển đổi cho Keras

Gần như tất cả thông tin được yêu cầu bởi TFF đều có thể được lấy ra bằng cách gọi các giao diện tf.keras , vì vậy nếu bạn có mô hình Keras, bạn có thể dựa vào tff.learning.from_keras_model để tạo một tff.learning.Model .

Lưu ý rằng TFF vẫn muốn bạn cung cấp một hàm tạo - một hàm mô hình không đối số, chẳng hạn như sau:

def model_fn():
  keras_model = ...
  return tff.learning.from_keras_model(keras_model, sample_batch, loss=...)

Ngoài chính mô hình, bạn cung cấp một loạt dữ liệu mẫu mà TFF sử dụng để xác định loại và hình dạng của đầu vào mô hình của bạn. Điều này đảm bảo rằng TFF có thể khởi tạo đúng mô hình cho dữ liệu thực sự sẽ có mặt trên các thiết bị khách (vì chúng tôi giả định rằng dữ liệu này thường không có sẵn tại thời điểm bạn đang xây dựng TensorFlow được tuần tự hóa).

Việc sử dụng trình bao bọc Keras được minh họa trong hướng dẫn phân loại hình ảnhtạo văn bản của chúng tôi.

Các nhà xây dựng tính toán liên bang

Gói tff.learning cung cấp một số trình xây dựng cho tff.Computation s thực hiện các nhiệm vụ liên quan đến học tập; chúng tôi hy vọng tập hợp các tính toán như vậy sẽ mở rộng trong tương lai.

Các giả định về kiến ​​trúc

Chấp hành

Có hai giai đoạn khác nhau trong việc chạy tính toán liên hợp.

  • Biên dịch : TFF đầu tiên biên dịch các thuật toán học liên hợp thành một biểu diễn tuần tự trừu tượng của toàn bộ tính toán phân tán. Đây là khi tuần tự hóa TensorFlow xảy ra, nhưng các biến đổi khác có thể xảy ra để hỗ trợ thực thi hiệu quả hơn. Chúng tôi đề cập đến biểu diễn được tuần tự hóa do trình biên dịch phát ra dưới dạng tính toán liên hợp .

  • Thực thi TFF cung cấp các cách để thực thi các tính toán này. Hiện tại, việc thực thi chỉ được hỗ trợ thông qua mô phỏng cục bộ (ví dụ: trong sổ ghi chép sử dụng dữ liệu phi tập trung được mô phỏng).

Một phép tính liên kết được tạo bởi API học tập liên kết của TFF, chẳng hạn như thuật toán đào tạo sử dụng tính trung bình của mô hình liên kết hoặc đánh giá liên kết, bao gồm một số yếu tố, đáng chú ý nhất là:

  • Một dạng tuần tự hóa của mã mô hình của bạn cũng như mã TensorFlow bổ sung được tạo bởi khung Học tập liên kết để thúc đẩy vòng lặp đào tạo / đánh giá mô hình của bạn (chẳng hạn như xây dựng trình tối ưu hóa, áp dụng các bản cập nhật mô hình, lặp qua tf.data.Dataset và các chỉ số máy tính, và áp dụng bản cập nhật tổng hợp trên máy chủ, để đặt tên cho một số).

  • Đặc điểm kỹ thuật khai báo về giao tiếp giữa máy kháchmáy chủ (thường là nhiều dạng tổng hợp khác nhau trên các thiết bị khách và truyền phát từ máy chủ tới tất cả các máy khách) và cách thức giao tiếp phân tán này được xen kẽ với việc thực thi máy khách-cục bộ hoặc máy chủ-cục bộ của mã TensorFlow.

Các phép tính liên kết được đại diện trong biểu mẫu được tuần tự hóa này được thể hiện bằng ngôn ngữ nội bộ độc lập với nền tảng khác với Python, nhưng để sử dụng API học liên kết, bạn sẽ không cần phải quan tâm đến các chi tiết của biểu diễn này. Các tính toán được biểu diễn trong mã Python của bạn dưới dạng các đối tượng kiểu tff.Computation , đối với hầu hết các phần, bạn có thể coi là các đối tượng có thể callable Python không rõ ràng.

Trong phần hướng dẫn, bạn sẽ gọi các phép tính liên kết đó như thể chúng là các hàm Python thông thường, được thực thi cục bộ. Tuy nhiên, TFF được thiết kế để thể hiện các phép tính liên hợp theo cách không phù hợp với hầu hết các khía cạnh của môi trường thực thi, để chúng có thể triển khai được, ví dụ như các nhóm thiết bị chạy Android hoặc các cụm trong một trung tâm dữ liệu. Một lần nữa, hệ quả chính của việc này là những giả định mạnh mẽ về quá trình tuần tự hóa . Đặc biệt, khi bạn gọi một trong các phương thức build_... được mô tả bên dưới, việc tính toán sẽ được tuần tự hóa đầy đủ.

Trạng thái mô hình hóa

TFF là một môi trường lập trình chức năng, nhưng nhiều quy trình quan tâm đến việc học liên kết là trạng thái. Ví dụ: một vòng huấn luyện bao gồm nhiều vòng lấy trung bình mô hình liên kết là một ví dụ về những gì chúng ta có thể phân loại là một quy trình trạng thái . Trong quá trình này, trạng thái phát triển từ vòng này sang vòng khác bao gồm tập hợp các tham số mô hình đang được huấn luyện và có thể là trạng thái bổ sung được liên kết với trình tối ưu hóa (ví dụ: vectơ động lượng).

Vì TFF có chức năng, các quy trình trạng thái được mô hình hóa trong TFF dưới dạng các phép tính chấp nhận trạng thái hiện tại như một đầu vào và sau đó cung cấp trạng thái cập nhật như một đầu ra. Để xác định đầy đủ một quy trình trạng thái, người ta cũng cần chỉ định trạng thái ban đầu đến từ đâu (nếu không chúng ta không thể khởi động quy trình). Điều này được ghi lại trong định nghĩa của lớp trợ giúp tff.templates.IterativeProcess , với 2 thuộc tính initializenext tương ứng với lần khởi tạo và lặp lại.

Các nhà xây dựng có sẵn

Hiện tại, TFF cung cấp hai hàm xây dựng tạo ra các phép tính liên hợp để đào tạo và đánh giá liên hợp:

Bộ dữ liệu

Các giả định về kiến ​​trúc

Lựa chọn khách hàng

Trong kịch bản học tập liên kết điển hình, chúng tôi có một lượng lớn tiềm năng hàng trăm triệu thiết bị khách, trong đó chỉ một phần nhỏ có thể đang hoạt động và có sẵn để đào tạo tại bất kỳ thời điểm nào (ví dụ: điều này có thể giới hạn ở các ứng dụng được cắm vào nguồn điện, không phải trên mạng đo lường và nếu không sử dụng). Nói chung, nhóm khách hàng có sẵn để tham gia đào tạo hoặc đánh giá nằm ngoài tầm kiểm soát của nhà phát triển. Hơn nữa, vì điều phối hàng triệu khách hàng là không thực tế, một vòng đào tạo hoặc đánh giá điển hình sẽ chỉ bao gồm một phần nhỏ các khách hàng có sẵn, có thể được lấy mẫu ngẫu nhiên .

Hệ quả chính của điều này là các tính toán liên hợp, theo thiết kế, được thể hiện theo cách mà không biết đến tập hợp chính xác của những người tham gia; tất cả quá trình xử lý được thể hiện dưới dạng các hoạt động tổng hợp trên một nhóm trừu tượng gồm các khách hàng ẩn danh và nhóm đó có thể khác nhau giữa các đợt đào tạo này sang đợt đào tạo khác. Sự ràng buộc thực tế của tính toán với những người tham gia cụ thể và do đó với dữ liệu cụ thể mà họ cung cấp vào tính toán, do đó được mô hình hóa bên ngoài bản thân tính toán.

Để mô phỏng việc triển khai thực tế mã học tập được liên kết của bạn, thông thường bạn sẽ viết một vòng lặp đào tạo giống như sau:

trainer = tff.learning.build_federated_averaging_process(...)
state = trainer.initialize()
federated_training_data = ...

def sample(federate_data):
  return ...

while True:
  data_for_this_round = sample(federated_training_data)
  state, metrics = trainer.next(state, data_for_this_round)

Để tạo điều kiện thuận lợi cho việc này, khi sử dụng TFF trong mô phỏng, dữ liệu liên kết được chấp nhận dưới dạng list Python, với một phần tử trên mỗi thiết bị khách tham gia để đại diện cho tf.data.Dataset cục bộ của thiết bị đó.

Giao diện trừu tượng

Để chuẩn hóa việc xử lý các tập dữ liệu liên kết được mô phỏng, TFF cung cấp một giao diện trừu tượng tff.simulation.datasets.ClientData , cho phép một người liệt kê tập hợp khách hàng và tạo một tf.data.Dataset chứa dữ liệu của một khách hàng. Các tf.data.Dataset đó có thể được cung cấp trực tiếp làm đầu vào cho các phép tính liên hợp được tạo ở chế độ háo hức.

Cần lưu ý rằng khả năng truy cập danh tính khách hàng là một tính năng chỉ được cung cấp bởi bộ dữ liệu để sử dụng trong mô phỏng, trong đó khả năng đào tạo về dữ liệu từ các tập hợp con cụ thể của khách hàng có thể cần thiết (ví dụ: để mô phỏng tính khả dụng hàng ngày của các loại khách hàng). Các tính toán đã biên dịch và thời gian chạy cơ bản không liên quan đến bất kỳ khái niệm nào về danh tính khách hàng. Sau khi dữ liệu từ một tập hợp con khách hàng cụ thể đã được chọn làm đầu vào, ví dụ: trong lệnh gọi tff.templates.IterativeProcess.next , danh tính khách hàng không còn xuất hiện trong đó nữa.

Bộ dữ liệu có sẵn

Chúng tôi đã dành riêng không gian tên tff.simulation.datasets cho các tập dữ liệu triển khai giao diện tff.simulation.datasets.ClientData để sử dụng trong mô phỏng và gieo nó với các tập dữ liệu để hỗ trợ phân loại hình ảnh và hướng dẫn tạo văn bản . Chúng tôi muốn khuyến khích bạn đóng góp bộ dữ liệu của riêng bạn cho nền tảng.