Optymalizacja zakupów w aplikacji w czasie rzeczywistym Laboratorium kodowania

1. Przegląd

1cbf855eda62c306.png

Witamy w laboratorium z programowania optymalizacji zakupów w aplikacji w czasie rzeczywistym na urządzeniu. W tym laboratorium z programowania dowiesz się, jak używać TensorFlow Lite i Firebase do uczenia i wdrażania niestandardowego modelu personalizacji w swojej aplikacji.

W tym samouczku pokazano, jak zbudować model uczenia maszynowego do personalizacji, w szczególności taki, który przewiduje optymalną ofertę zakupów w aplikacji (IAP) przy uwzględnieniu stanu, w którym znajduje się bieżący użytkownik. Jest to przykład kontekstowego problemu bandyty, ważnego i szeroko stosowany rodzaj problemu uczenia maszynowego, o którym dowiesz się więcej w tym laboratorium z programowania

Czego się dowiesz

  • Zbieraj dane analityczne za pomocą analiz Firebase
  • Wstępnie przetwarzaj dane analityczne za pomocą BigQuery
  • Wytrenuj prosty model uczenia maszynowego w celu optymalizacji zakupów w aplikacji (IAP) na urządzeniu
  • Wdrażaj modele TFLite w Firebase ML i uzyskuj do nich dostęp ze swojej aplikacji
  • Mierz i eksperymentuj z różnymi modelami za pomocą testów A/B Firebase
  • Trenuj i wdrażaj nowe modele, korzystając z najnowszych danych w powtarzającym się rytmie

Co będziesz potrzebował

  • Android Studio w wersji 3.4+
  • Fizyczne urządzenie testowe z Androidem 2.3 lub nowszym i usługami Google Play 9.8 lub nowszymi lub emulator z usługami Google Play 9.8 lub nowszymi
  • W przypadku korzystania z fizycznego urządzenia testowego, kabel połączeniowy
  • Początkująca wiedza na temat ML

Jak będziesz korzystać z tego samouczka?

Przeczytaj tylko i wyłącznie Przeczytaj i wykonaj ćwiczenia

Jak oceniasz swoje doświadczenie w tworzeniu aplikacji na Androida?

Nowicjusz Mediator Biegły

2. Opis problemu

Załóżmy, że jesteś twórcą gier i chcesz wyświetlać spersonalizowane sugestie zakupów w aplikacji (IAP) na końcu każdego poziomu. Za każdym razem możesz wyświetlić tylko ograniczoną liczbę opcji IAP i nie wiesz, które z nich zapewnią najlepszą konwersję. Biorąc pod uwagę, że każdy użytkownik i każda sesja jest inna, jak znaleźć ofertę IAP, która zapewni najwyższą oczekiwaną nagrodę?

3. Pobierz przykładowy kod

Sklonuj repozytorium GitHub z wiersza poleceń.

git clone https://github.com/googlecodelabs/firebase-iap-optimization.git

To repozytorium zawiera:

  1. Notatnik Jupyter (.ipynb), który szkoli model personalizacji i pakuje go w model TFLite
  2. Przykładowa aplikacja Kotlin korzystająca z modelu TFLite do przewidywania na urządzeniu

4. Uruchom aplikację za pomocą Firebase

Podczas tych zajęć z programowania będziemy pracować nad optymalizacją IAP naszej fikcyjnej aplikacji do gier – Flappy Sparky . Gra jest side-scrollerem, w której gracz kontroluje Sparky'ego, próbując latać pomiędzy kolumnami ścian, nie uderzając ich. Na początku poziomu użytkownik otrzymuje ofertę IAP, która zapewni mu wzmocnienie. Podczas tych zajęć z programowania będziemy wdrażać tylko część aplikacji związaną z optymalizacją IAP.

Będziesz mógł zastosować to, czego się tutaj nauczysz, we własnej aplikacji połączonej z projektem Firebase. Alternatywnie możesz utworzyć nowy projekt Firebase dla tego ćwiczenia z programowania. Jeśli potrzebujesz pomocy w rozpoczęciu korzystania z Firebase, zapoznaj się z naszymi samouczkami na ten temat ( Android i iOS ).

5. Zbieraj zdarzenia analityczne w swojej aplikacji

Zdarzenia Analytics zapewniają wgląd w zachowania użytkowników i służą do uczenia modelu uczenia maszynowego. Na przykład model może dowiedzieć się, że użytkownicy, którzy grają dłużej, z większym prawdopodobieństwem dokonają IAP, aby zyskać dodatkowe życia. Model ML potrzebuje zdarzeń analitycznych jako danych wejściowych, aby poznać te informacje.

Niektóre zdarzenia analityczne, które możemy chcieć rejestrować, obejmują:

  • Jak długo użytkownik gra w grę
  • Jaki poziom osiąga użytkownik
  • Ile monet wydaje użytkownik
  • Jakie przedmioty kupuje użytkownik

Pobierz przykładowe dane (opcjonalnie)

W kolejnych krokach użyjemy Firebase Analytics do rejestrowania zdarzeń analitycznych do wykorzystania w naszym modelu. Jeśli masz już dane analityczne, których chcesz użyć, przejdź do sekcji „Szkolenie modelu optymalizacji” w tym ćwiczeniu z programowania, gdzie możesz śledzić nasze przykładowe dane.

Zbieraj dane za pomocą pakietu SDK Firebase Analytics

Będziemy korzystać z Firebase Analytics, aby pomóc w gromadzeniu tych zdarzeń analitycznych. Pakiet SDK Firebase Analytics automatycznie przechwytuje wiele zdarzeń i właściwości użytkownika. Umożliwia także definiowanie własnych zdarzeń niestandardowych w celu pomiaru zdarzeń unikalnych dla Twojej aplikacji.

Instalowanie pakietu SDK Firebase Analytics

Możesz rozpocząć korzystanie z Firebase Analytics w swojej aplikacji, postępując zgodnie z dokumentacją Wprowadzenie do Google Analytics. Repozytorium firebase-iap-optimization sklonowane na początku tego ćwiczenia z programowania zawiera już pakiet SDK Firebase Analytics.

Rejestruj zdarzenia niestandardowe

Po skonfigurowaniu pakietu SDK Firebase Analytics możemy rozpocząć rejestrowanie zdarzeń potrzebnych do uczenia naszego modelu.

Zanim to zrobimy, ważne jest, aby ustawić identyfikator użytkownika w zdarzeniu analitycznym, abyśmy mogli powiązać dane analityczne tego użytkownika z jego istniejącymi danymi w aplikacji.

MainActivity.kt

firebaseAnalytics.setUserId("player1")

Następnie możemy rejestrować zdarzenia graczy. W celu optymalizacji IAP chcemy rejestrować każdą ofertę IAP przedstawioną użytkownikowi i to, czy użytkownik kliknął tę ofertę. To da nam dwa zdarzenia analityczne - offer_iap i offer_accepted . Będziemy również śledzić unikalny identyfikator oferty, dzięki czemu będziemy mogli go później wykorzystać do połączenia tych danych i sprawdzenia, czy oferta zostanie zaakceptowana.

MainActivity.kt

predictButton?.setOnClickListener {
  predictionResult = iapOptimizer.predict()

  firebaseAnalytics.logEvent("offer_iap"){
    param("offer_type", predictionResult)
    param("offer_id", sessionId)
  }
}

acceptButton?.setOnClickListener {
  firebaseAnalytics.logEvent("offer_accepted") {
    param("offer_type", predictionResult)
    param("offer_id", sessionId)
  }
}

Więcej informacji na temat rejestrowania zdarzeń niestandardowych można znaleźć w dokumentacji zdarzeń dziennika Firebase Analytics .

6. Wstępnie przetwórz dane w BigQuery

W ostatnim kroku zebraliśmy zdarzenia dotyczące tego, która oferta IAP jest prezentowana użytkownikowi i na którą ofertę IAP użytkownik klika. Na tym etapie połączymy dane o zdarzeniach z danymi użytkownika, aby nasz model mógł uczyć się na podstawie pełnego obrazu.

Aby to zrobić, musimy zacząć od wyeksportowania zdarzeń analitycznych do BigQuery.

Aby połączyć projekt Firebase i jego aplikacje z BigQuery:

  1. Zaloguj się do Firebase.
  2. Kliknij the Settings icon , a następnie wybierz Ustawienia projektu.
  3. Na stronie Ustawienia projektu kliknij kartę Integracje.
  4. Na karcie BigQuery kliknij Link.

(Opcjonalnie) Wyeksportuj swoje kolekcje Firestore do BigQuery

Na tym etapie możesz wyeksportować dodatkowe dane użytkownika z Firestore do BigQuery, aby wykorzystać je do uczenia modelu. Jeśli chcesz na razie pominąć ten krok, przejdź do sekcji „Przygotowywanie danych w BigQuery” w tym ćwiczeniu z programowania i możesz śledzić zdarzenia Firebase Analytics zarejestrowane w ostatnim kroku.

W Firestore możesz przechowywać datę rejestracji użytkownika, dokonane zakupy w aplikacji, poziomy w grze, saldo monet lub inne atrybuty, które mogą być przydatne w szkoleniu modelu.

Aby wyeksportować kolekcje Firestore do BigQuery, możesz zainstalować rozszerzenie Firestore BigQuery Export Extension . Następnie połącz tabele w BigQuery, aby połączyć te dane z danymi z Google Analytics i wykorzystać je w swoim modelu personalizacji oraz w pozostałej części tego ćwiczenia z programowania.

Przygotowanie danych w BigQuery

W kolejnych kilku krokach użyjemy BigQuery do przekształcenia naszych surowych danych analitycznych w dane, które można wykorzystać do szkolenia naszego modelu.

Aby nasz model mógł dowiedzieć się, która oferta IAP będzie prezentowana na podstawie użytkownika i stanu gry, musimy uporządkować dane na temat:

  • użytkownik
  • stan gry
  • przedstawioną ofertę
  • czy prezentowana oferta została kliknięta czy nie

Wszystkie te dane będą musiały zostać zorganizowane w jednym wierszu tabeli, aby nasz model mógł je przetworzyć. Na szczęście BigQuery jest skonfigurowane tak, aby nam w tym pomóc.

BigQuery umożliwia tworzenie „widoków”, dzięki którym można uporządkować zapytania. Widok to wirtualna tabela zdefiniowana przez zapytanie SQL. Tworząc widok, wysyłasz do niego zapytania w taki sam sposób, jak do tabeli. Dzięki temu możemy najpierw wyczyścić nasze dane analityczne.

Aby sprawdzić, czy kliknięto każdą ofertę zakupu w aplikacji, musimy dołączyć do zdarzeń offer_iap i offer_accepted , które zarejestrowaliśmy w poprzednim kroku.

all_offers_joined – widok BigQuery

SELECT
  iap_offers.*,
  CASE
    WHEN accepted_offers.accepted IS NULL THEN FALSE ELSE TRUE
  END
  is_clicked,
FROM
  `iap-optimization.ml_sample.accepted_offers` AS accepted_offers
RIGHT JOIN
  `iap-optimization.ml_sample.iap_offers` AS iap_offers
ON
 accepted_offers.offer_id =iap_offers.offer_id;

all_offers_with_user_data – widok BigQuery

SELECT
  offers.is_clicked,
  offers.presented_powerup,
  offers.last_run_end_reason,
  offers.event_timestamp,
  users.*
FROM
  `iap-optimization.ml_sample.all_offers_joined` AS offers
LEFT JOIN
  `iap-optimization.ml_sample.all_users` AS users
ON
  users.user_id = offers.user_id;

Eksportuj zbiór danych bigQuery do Google Cloud Storage

Na koniec możemy wyeksportować zbiór danych BigQuery do GCS, abyśmy mogli go wykorzystać w naszym szkoleniu modelu.

888daa7ba4db8e44.png

14d22bf474fae455.png

7. Wytrenuj model optymalizacyjny

Przykładowe dane

Skorzystaj z danych z poprzedniego kroku „Wstępne przetwarzanie danych w BigQuery” lub udostępnionych tutaj przykładowych danych do pobrania i wykorzystaj je w dalszej części ćwiczeń z programowania.

Definicja problemu

Zanim zaczniemy trenować model, poświęćmy trochę czasu na zdefiniowanie naszego kontekstowego problemu bandytów.

Wyjaśniono kontekstowych bandytów

Na początku każdego poziomu we Flappy Sparky użytkownik otrzymuje ofertę IAP, która zapewni mu wzmocnienie. Za każdym razem możemy wyświetlić tylko jedną opcję IAP i nie wiemy, która z nich będzie miała najlepszą konwersję. Biorąc pod uwagę, że każdy użytkownik i każda sesja jest inna, jak znaleźć ofertę IAP, która zapewni najwyższą oczekiwaną nagrodę?

W tym przypadku ustawmy nagrodę na 0, jeśli użytkownik nie zaakceptuje oferty IAP, i wartość IAP, jeśli to zrobi. Aby zmaksymalizować Twoją nagrodę, możemy wykorzystać nasze dane historyczne do wytrenowania modelu, który przewiduje oczekiwaną nagrodę za każde działanie danego użytkownika i znaleźć działanie z najwyższą nagrodą.

e7d3264141498bff.jpeg

Oto, czego użyjemy w prognozie:

  • Stan: informacje o użytkowniku i jego bieżącej sesji
  • Działanie: oferty IAP, które możemy wyświetlić
  • Nagroda: wartość oferty IAP

Eksploatacja vs eksploracja

W przypadku wszystkich problemów z wielorękimi bandytami algorytm musi zachować równowagę pomiędzy eksploracją (uzyskaniem większej ilości danych, aby dowiedzieć się, które działanie daje optymalny wynik) a eksploatacją (wykorzystaniem optymalnego wyniku w celu uzyskania najwyższej nagrody).

W naszej wersji problemu uprościmy to, aby trenować model tylko okresowo w chmurze i wykonywać przewidywania tylko podczas korzystania z modelu na urządzeniu użytkownika (w przeciwieństwie do uczenia również na urządzeniu użytkownika). Aby mieć pewność, że po użyciu modelu mamy wystarczające dane szkoleniowe, czasami będziemy musieli wyświetlać losowe wyniki użytkownikom naszej aplikacji (np. 30%). Ta strategia równoważenia poszukiwań i wydobycia nazywa się zachłannością Epsilon .

Trenowanie modelu

Na początek możesz skorzystać ze skryptu szkoleniowego ( training.ipynb ) dostarczonego z ćwiczeniami z kodowania. Naszym celem jest wytrenowanie modelu, który przewiduje oczekiwane nagrody za każdą akcję przy danym stanie, a następnie znajdujemy akcję, która daje nam najwyższe oczekiwane nagrody.

Szkolenia lokalnie

Najłatwiejszym sposobem rozpoczęcia szkolenia własnego modelu jest utworzenie kopii notesu w przykładowym kodzie dla tego ćwiczenia z programowania.

Do tych zajęć z programowania nie potrzebujesz procesora graficznego, ale jeśli potrzebujesz mocniejszej maszyny do eksploracji własnych danych i trenowania własnego modelu, możesz uzyskać instancję AI Platform Notebook, aby przyspieszyć szkolenie.

W dostarczonym skrypcie szkoleniowym utworzyliśmy iterator, który generuje dane szkoleniowe z plików CSV wyeksportowanych z BigQuery. Następnie wykorzystaliśmy te dane, aby rozpocząć trenowanie naszego modelu za pomocą Keras. Szczegóły dotyczące uczenia modelu można znaleźć w komentarzach do notatnika Pythona.

Zmierz wydajność modelu

Trenując model, porównamy go z losowym agentem, który losowo wybiera oferty IAP, aby sprawdzić, czy nasz model rzeczywiście się uczy. Ta logika znajduje się w ValidationCallback .

Na koniec szkolenia wykorzystujemy dane w test.csv , aby ponownie przetestować nasz model. Model nigdy wcześniej nie widział takich danych, więc możemy być pewni, że wynik nie jest wynikiem nadmiernego dopasowania . W tym przypadku model działa o 28% lepiej niż agent losowy.

Eksportuj model TFLite

Teraz mamy przeszkolony model gotowy do użycia, z tą różnicą, że jest on obecnie w formacie TensorFlow. Będziemy musieli wyeksportować model w formacie TFLite , aby można go było uruchomić na urządzeniach mobilnych.

pociąg.ipynb

converter = tflite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

with tf.io.gfile.GFile('iap-optimizer.tflite', 'wb') as f:
  f.write(tflite_model)

Stąd możesz pobrać model i powiązać go ze swoją aplikacją.

Opcjonalnie w przypadku aplikacji produkcyjnej zalecamy wdrożenie modelu w Firebase ML i umożliwienie hostowania modelu w Firebase. Jest to przydatne z dwóch głównych powodów:

  1. Możemy zachować niewielki rozmiar instalacji aplikacji i pobrać model tylko w razie potrzeby
  2. Model może być regularnie aktualizowany i mieć inny cykl wydawniczy niż cała aplikacja

Aby dowiedzieć się, jak wdrożyć model w Firebase ML, wykonaj ćwiczenia z programowania dotyczące dodawania Firebase do aplikacji na Androida opartej na TFLite . Masz możliwość wdrożenia przy użyciu konsoli Firebase lub interfejsu API języka Python.

8. Dokonywanie prognoz na urządzeniu

Następnym krokiem jest dokonanie prognoz przy użyciu modelu na urządzeniu. Przykładową aplikację, która pobiera model z Firebase ML, możesz znaleźć w folderze app w pobranym przykładowym kodzie i używać jej do wnioskowania na podstawie niektórych danych po stronie klienta.

Ponieważ podczas uczenia modelu zastosowaliśmy pewne przetwarzanie wstępne, będziemy musieli zastosować to samo przetwarzanie wstępne do danych wejściowych modelu podczas uruchamiania na urządzeniu. Prostym sposobem na osiągnięcie tego jest użycie formatu niezależnego od platformy i języka, takiego jak plik JSON zawierający mapę każdej funkcji na metadane dotyczące sposobu przeprowadzania wstępnego przetwarzania. Więcej szczegółów na temat tego, jak to się robi, można znaleźć w przykładowej aplikacji.

Następnie podajemy modelowi dane wejściowe testowe w następujący sposób:

IapOptimzer.kt

  val testInput = mapOf(
    "coins_spent" to                       2048f,
    "distance_avg" to                      1234f,
    "device_os" to                         "ANDROID",
    "game_day" to                          10f,
    "geo_country" to                       "Canada",
    "last_run_end_reason" to               "laser"
  )

Model sugeruje, że sparky_armor jest najlepszym wzmocnieniem IAP dla tego konkretnego użytkownika.

a3381dbcdbdf811e.png

Zmierz dokładność modelu

Aby zmierzyć dokładność naszego modelu, możemy po prostu śledzić oferty IAP przewidywane przez nasz model i to, czy są one klikane, za pomocą Firebase Analytics. Możesz użyć tego razem z testami A/B Firebase, aby zmierzyć rzeczywistą wydajność modelu. Idąc o krok dalej, możesz także przeprowadzić testy A/B na różnych iteracjach modelu. Więcej informacji na temat testów A/B z Firebase znajdziesz w dokumentacji Tworzenie eksperymentów zdalnej konfiguracji Firebase za pomocą testów A/B .

9. (Opcjonalnie): Regularna aktualizacja modelu o nowe dane

Jeśli musisz aktualizować model w miarę napływania nowych danych, możesz skonfigurować potok w celu powtarzania ponownego uczenia modelu. Aby to zrobić, musisz najpierw upewnić się, że masz nowe dane do wykorzystania w szkoleniu, korzystając ze strategii zachłanności epsilon, o której wspomnieliśmy powyżej. (np. wykorzystanie wyników przewidywania modelu w 70% przypadków i wykorzystanie wyników losowych w 30% przypadków).

Skonfigurowanie potoku na potrzeby szkolenia i wdrażania przy użyciu nowych danych wykracza poza zakres tego ćwiczenia z programowania. Na początek możesz wypróbować Google Cloud AI Platform i TFX .

10. Gratulacje!

Podczas tych zajęć z programowania nauczyłeś się trenować i wdrażać model TFLite na urządzeniu w celu optymalizacji zakupów w aplikacji przy użyciu Firebase. Aby dowiedzieć się więcej o TFLite i Firebase, zapoznaj się z innymi przykładami TFLite i przewodnikami wprowadzającymi do Firebase.

Jeśli masz jakieś pytania, możesz je zostawić w Stack Overflow #firebase-machine-learning .

Co omówiliśmy

  • TensorFlow Lite
  • Baza Firebase ML
  • Analityka Firebase
  • BigQuery

Następne kroki

  • Trenuj i wdrażaj model optymalizatora dla swojej aplikacji.

Ucz się więcej