기계 학습 접근 방식으로 Fizz Buzz 문제의 출력 예측 및 생성 깊은 FizzBuzzNet.

잠깐만요, 제목이 제 머릿속에 너무 멋져서 석사과정을 하게 된다면 그 제목을 제 논문으로 쓸까 생각하고 있어요.

이슬람의 al-fatihah와 같이 FizzBuzzProblem에 익숙할 수도 있습니다. fizzbuzz 문제는 소프트웨어 엔지니어인 경우 구직 세계에서도 필수입니다. 일반적으로 범위(n)에서 루프 i를 만들라는 요청을 받습니다.
  • i가 3으로 나누어지면 fizz가 인쇄됩니다
  • .
  • i를 5로 나눌 수 있는 경우 버즈를 인쇄합니다
  • .
  • i가 3과 5 또는 숫자 15로 나누어지는 경우 FizzBuzz를 인쇄합니다.

  • 파이썬으로 구현했습니다.

    def fizzbuzz(number: int) -> str:
        if number % 15 == 0:
            return "fizzbuzz"
        elif number % 3 == 0:
            return "fizz"
        elif number % 5 == 0:
            return "buzz"
        return str(number)
    assert fizzbuzz(1) == "1"
    assert fizzbuzz(3) == "fizz"
    assert fizzbuzz(5) == "buzz"
    assert fizzbuzz(15) == "fizzbuzz"
    
    


    이 문제를 해결하는 방법에는 여러 가지가 있습니다. 소프트웨어 엔지니어라면 수동으로 인쇄하는 것은 확실히 금지되어 있습니다. 루프 + 조건을 사용할 때까지. 하지만 정말 멋지다고 생각하는 접근 방식이 있습니다. 바로 머신 러닝 접근 방식입니다.
    그래서 다른 딥 러닝 라이브러리인 Pytorch를 사용하여 빌드하기로 결정했습니다.

    데이터 세트 생성



    내가하고 싶은 첫 번째 단계는 인코딩 된 숫자의 출력 목록을 이진수로 생성하는 두 개의 매개 변수 i와 숫자를 받아들이는 함수를 작성하여 데이터 세트를 생성하는 것입니다.

    def binary_encode(i: int, num_digits: int) -> List[int]:
        return np.array([i >> d & 1 for d in range(num_digits)])
    


    이 기능을 10번 테스트하겠습니다.



    다음으로 fizzbuzz 출력을 인코딩할 것입니다. 수행할 출력에 따라 다릅니다.

    def fizz_buzz_encode(i: int) -> int:
        if   i % 15 == 0: return 3
        elif i % 5  == 0: return 2
        elif i % 3  == 0: return 1
        else: return 0
    
    def fizz_buzz(i: int, prediction: int) -> str:
        return [str(i), "fizz", "buzz", "fizzbuzz"][prediction]
    


    데이터 세트를 교육 및 테스트로 분할




    X = np.array([binary_encode(i, NUM_DIGITS) for i in range(101, 2 ** NUM_DIGITS)])
    y = np.array([fizz_buzz_encode(i) for i in range(101, 2 ** NUM_DIGITS)])
    
    X_train = X[100:]
    y_train = y[100:]
    X_test= X[:100]
    y_test= y[:100]
    


    분할된 데이터 세트의 크기는 다음과 같습니다.



    모델링



    하이퍼파타미터 튜닝을 할 수 있기 때문에 이것은 저에게 가장 흥미로운 프로세스였습니다. 코드는 다음과 같습니다.

    class FizzBuzz(nn.Module):
        def __init__(self) -> None:
            super().__init__()
            self.first = nn.Linear(10, 100)
            self.relu = nn.ReLU()
            self.bactnorm1d = nn.BatchNorm1d(100)
            self.output = nn.Linear(100, 4)
    
        def forward(self, x: torch.Tensor) -> torch.Tensor:
            a = self.first(x)
            relu = self.relu(a)
            batcnorm = self.bactnorm1d(relu)
            return self.output(batcnorm)
    


    교차 엔트로피 손실을 내 기준으로 선택하고 Adam을 옵티마이저로 선택했으며 학습률은 1-e3입니다.

    훈련 과정이 끝나면 이것은 내 마지막 에포크의 손실입니다. 나는 1000 에포크 베이를 설정했습니다.
    검증 손실: tensor(0.5942, grad_fn=) 훈련 손실: tensor(0.3454, grad_fn=)

    테스트




    이것은 꽤 좋았습니다. 기계 학습 모델은 100개의 테스트 데이터에 대해 제대로 작동하지 않았습니다.

    전체 코드 사용

    참조:
    Jeol Gruss's Blog

    Blog

    좋은 웹페이지 즐겨찾기