
안녕하세요.
인공지능을 시작할 때 보통 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. 처음 시작하실 때의 흐름 제안
- 문제 유형 정리: 분류/회귀/랭킹/추천/텍스트/이미지 중 무엇인지 결정합니다.
- 기준선 만들기: Tribuo로 가볍게 학습→평가까지 해보겠습니다.
- 성능 향상: 필요하면 XGBoost4J로 부스팅을 적용합니다.
- 딥러닝 도메인: DJL로 사전학습 모델 추론부터 시작하고, 필요 시 파인튜닝을 검토합니다.
- 서빙/배포: Spring Boot와 통합해 REST API로 노출하거나, 배치 파이프라인에 투입해보겠습니다.
- 지속 개선: 지표/로그를 수집하고, 데이터 품질과 하이퍼파라미터를 개선합니다.
“Python이 많지만 Java로도 충분히 시작할 수 있다”는 관점에서,
라이브러리 선택과 세팅, 기준선 학습/추론까지 빠르게 훑어보았습니다.
3편에서는 딥러닝의 뼈대와 어텐션, 트랜스포머를 부드러운 비유와 간단 예시로 정리해보겠습니다.
읽어주셔서 감사합니다.
'TIPS' 카테고리의 다른 글
| 인공지능의 기초 원리부터 고급까지 part.4 (4/4) (0) | 2025.09.29 |
|---|---|
| 인공지능의 기초 원리부터 고급까지 part.3 (3/4) (0) | 2025.09.22 |
| 인공지능의 기초 원리부터 고급까지 part.1 (1/4) (0) | 2025.09.08 |
| 실무용 페이징 전략! OFFSET/LIMIT를 넘어 Keyset Pagination까지 (4) | 2025.09.01 |
| 다양한 x + JOIN 차이 언제 어떤 걸 써야 할까? (6) | 2025.08.25 |