본문 바로가기

TIPS

인공지능의 기초 원리부터 고급까지 part.2 (2/4)

728x90
반응형
SMALL

 

안녕하세요.

인공지능을 시작할 때 보통 Python을 많이 사용합니다.

생태계가 크고, 연구용 라이브러리가 풍부하며, 예제가 많기 때문입니다.

 

반면 저는 Java로도 충분히 시작할 수 있다고 생각합니다.

Java는 운영 환경 배포, 안정적인 타입 시스템, 성숙한 빌드/테스트/서빙 도구,

그리고 백엔드와 자연스러운 통합에 강점이 있습니다.

 

즉, 연구·프로토타입은 Python이 유리한 면이 있지만,

서비스로 내보내고 유지보수하는 데는 Java가 편한 경우가 많다고 정리할 수 있습니다.

 

아래에서는 Java로 AI를 시작할 때 꼭 알아두면 좋은 라이브러리프로젝트 세팅 → 간단 학습/추론 예시까지 단계별로 정리해보겠습니다.


1. Java에서 자주 쓰는 AI/ML 라이브러리 한눈에 보기

 

  • Tribuo: 순수 Java 머신러닝(로지스틱 회귀, 트리/랜덤포레스트, SVM 등)과 데이터 로딩·평가 기능을 제공합니다. 기초 분류/회귀 학습을 빠르게 해볼 수 있습니다.
  • XGBoost4J / LightGBM(Java): 표 형식 데이터(탭룰러)에서 강력한 부스팅 모델을 Java에서 사용할 수 있습니다. 고성능 예측이 필요할 때 고려합니다.
  • DJL(Deep Java Library): PyTorch/TF/ONNX 백엔드를 Java에서 통합해 쓰는 라이브러리입니다. 사전학습 모델로 전이학습/추론을 쉽게 해볼 수 있습니다.
  • ONNX Runtime Java: 다른 언어에서 학습한 모델(ONNX)을 Java 서비스에 경량 추론으로 붙일 때 좋습니다.
  • Spark MLlib(Java API): 대용량 분산 학습/추론이 필요할 때 선택합니다.

 

요약하면, 학습의 시작은 Tribuo, 고성능 탭룰러는 XGBoost4J, 딥러닝 추론·전이학습은 DJL/ONNX, 대용량은 Spark MLlib로 잡아보겠습니다.


2. 프로젝트 준비: JDK·빌드도구·의존성 추가

 

JDK: 17 이상을 권장합니다.

빌드 도구: Maven 또는 Gradle 중 편한 도구를 사용합니다.

의존성(예시): 아래는 Maven 기준입니다. Gradle을 쓰신다면 같은 GAV를 implementation으로 추가하시면 됩니다.

 

<!-- Tribuo: 기본 머신러닝 -->
<dependency>
  <groupId>org.tribuo</groupId>
  <artifactId>tribuo-classification-core</artifactId>
  <version>4.3.1</version>
</dependency>
<dependency>
  <groupId>org.tribuo</groupId>
  <artifactId>tribuo-classification-logistic</artifactId>
  <version>4.3.1</version>
</dependency>

<!-- XGBoost4J: 고성능 부스팅 -->
<dependency>
  <groupId>ml.dmlc</groupId>
  <artifactId>xgboost4j</artifactId>
  <version>1.7.6</version>
</dependency>

<!-- DJL: 딥러닝 추론/전이학습 -->
<dependency>
  <groupId>ai.djl</groupId>
  <artifactId>api</artifactId>
  <version>0.27.0</version>
</dependency>
<dependency>
  <groupId>ai.djl</groupId>
  <artifactId>pytorch-engine</artifactId>
  <version>0.27.0</version>
</dependency>
 

처음에는 Tribuo만 추가해서 로지스틱 회귀나 랜덤포레스트로 빠르게 “끝까지 한 번” 돌려보신 뒤,

필요할 때 XGBoost4J/DJL을 추가하는 흐름이 깔끔합니다.


3. 첫 학습: Tribuo로 “기준선(Baseline)” 만들어보기

 

목표는 간단합니다. CSV 데이터를 읽어 → 학습 → 평가까지 한 번에 해보겠습니다.

CSV에는 label 컬럼(정답)과 여러 수치/문자 특성이 있다고 가정합니다.

 

import org.tribuo.*;
import org.tribuo.classification.*;
import org.tribuo.classification.evaluation.LabelEvaluator;
import org.tribuo.classification.sgd.logistic.LogisticRegressionTrainer;
import org.tribuo.data.csv.CSVLoader;

import java.nio.file.Paths;

public class BaselineWithTribuo {
    public static void main(String[] args) throws Exception {
        var loader = new CSVLoader<>(new LabelFactory());
        var train  = new MutableDataset<>(loader.loadDataSource(Paths.get("train.csv"), "label"));
        var test   = new MutableDataset<>(loader.loadDataSource(Paths.get("test.csv"), "label"));

        var trainer = new LogisticRegressionTrainer();   // 기준선: 빠르고 해석 쉬움
        var model   = trainer.train(train);

        var eval    = new LabelEvaluator().evaluate(model, test);
        System.out.println(eval.toString());             // 정확도, 정밀도/재현율 등
    }
}
 
  • 여기까지가 “기준선”입니다. 숫자가 어느 정도 나오는지 감을 잡고,
  • 필요하면 랜덤포레스트/부스팅 모델로 바꿔 성능을 끌어올려보겠습니다.

 


4. 더 높은 성능: XGBoost4J로 부스팅 적용해보기

 

탭룰러(표) 데이터에서 성능을 더 올리고 싶을 때입니다.

데이터는 LibSVM 포맷 또는 DMatrix로 로딩합니다.

 

import ml.dmlc.xgboost4j.java.*;

import java.util.HashMap;

public class XgbQuickStart {
    public static void main(String[] args) throws Exception {
        DMatrix train = new DMatrix("train.svm.txt");
        DMatrix valid = new DMatrix("valid.svm.txt");

        var params = new HashMap<String, Object>();
        params.put("objective", "binary:logistic");
        params.put("eval_metric", "auc");
        params.put("eta", 0.1);         // 학습률
        params.put("max_depth", 6);     // 트리 깊이

        var watches = new HashMap<String, DMatrix>();
        watches.put("train", train);
        watches.put("valid", valid);

        Booster booster = XGBoost.train(train, params, 200, watches, null, null);
        float[][] pred = booster.predict(valid);
        System.out.println("첫 예측 확률: " + pred[0][0]);
    }
}
 

 

여기서 하이퍼파라미터(eta, max_depth, subsample, colsample_bytree) 를 조정하면서 AUC/F1 같은 지표를 올려보겠습니다.

카테고리 변수는 원-핫 인코딩 또는 라이브러리 지원 인코딩을 사용해보겠습니다.

 


 

5. 딥러닝은 “처음부터”가 아니라 “전이학습/추론”부터

 

이미지·텍스트처럼 표현 학습이 중요한 도메인은 사전학습 모델을 불러와 바로 추론한 뒤,

필요하면 일부 레이어만 미세 조정(파인튜닝) 해보는 접근이 효율적입니다.

DJL로 시작해보겠습니다.

 

import ai.djl.Application;
import ai.djl.inference.Predictor;
import ai.djl.modality.Classifications;
import ai.djl.modality.cv.Image;
import ai.djl.modality.cv.ImageFactory;
import ai.djl.repository.zoo.Criteria;
import ai.djl.repository.zoo.ZooModel;

import java.nio.file.Paths;

public class DjlInferenceDemo {
    public static void main(String[] args) throws Exception {
        var criteria = Criteria.builder()
                .optApplication(Application.CV.IMAGE_CLASSIFICATION)
                .setTypes(Image.class, Classifications.class)
                .build();

        try (ZooModel<Image, Classifications> model = criteria.loadModel();
             Predictor<Image, Classifications> predictor = model.newPredictor()) {
            Image img = ImageFactory.getInstance().fromFile(Paths.get("cat.jpg"));
            Classifications out = predictor.predict(img);
            System.out.println(out.topK(3));  // 상위 3개 예측 라벨
        }
    }
}
 

 

운영 환경에서 추론 속도/메모리가 더 중요하다면,

학습된 모델을 ONNX로 변환ONNX Runtime Java로 서비스에 붙이는 방법도 고려해보겠습니다.

 


 

6. 처음 시작하실 때의 흐름 제안

 

  1. 문제 유형 정리: 분류/회귀/랭킹/추천/텍스트/이미지 중 무엇인지 결정합니다.
  2. 기준선 만들기: Tribuo로 가볍게 학습→평가까지 해보겠습니다.
  3. 성능 향상: 필요하면 XGBoost4J로 부스팅을 적용합니다.
  4. 딥러닝 도메인: DJL로 사전학습 모델 추론부터 시작하고, 필요 시 파인튜닝을 검토합니다.
  5. 서빙/배포: Spring Boot와 통합해 REST API로 노출하거나, 배치 파이프라인에 투입해보겠습니다.
  6. 지속 개선: 지표/로그를 수집하고, 데이터 품질과 하이퍼파라미터를 개선합니다.

 

 

 

“Python이 많지만 Java로도 충분히 시작할 수 있다”는 관점에서,

라이브러리 선택과 세팅, 기준선 학습/추론까지 빠르게 훑어보았습니다.

3편에서는 딥러닝의 뼈대와 어텐션, 트랜스포머를 부드러운 비유와 간단 예시로 정리해보겠습니다.

읽어주셔서 감사합니다.

 

 

 

 

 

 

 

728x90
반응형
LIST